Como funciona a chamada de comandos no shell
Não, não é um comando. A maneira como os shells funcionam é quando você digita uma linha de texto, a primeira palavra será tratada como comando e, se o comando não for um dos shell integrados, o shell procurará todos os locais listados na PATH
variável de ambiente .
O que acontece se o comando que você deseja executar estiver no mesmo diretório em que você está localizado atualmente, mas esse diretório não estiver na lista de PATH
diretórios? É quando você precisa usar ./
. É exatamente o mesmo que fazer /bin/bash
- você está dizendo ao shell onde estava o comando desejado, um caminho completo para ele. E, no caso de ./, você está dizendo "shell neste diretório". A parte mais importante é que você precisa estar no mesmo diretório em que o arquivo está localizado.
É claro que, para realmente executar um executável, ele deve ter um conjunto de bits executável, então você precisará chmod +x ./my_file
.
Portanto, as etapas importantes:
cd
onde você salvou o arquivo; se estiver dentro ~/Downloads
, entãocd ~/Downloads
- Execute
chmod +x ./truecrypt-7.2-setup-x86
, isto diz "torne o arquivo truecrypt-7.2-setup-x86 que está neste diretório executável"
- E agora faça
sudo ./truecrypt-7.2-setup-x86
Observe que o uso de ./
não é um comportamento aleatório, mas na verdade é um padrão, especificado pelo padrão da Interface do sistema operacional portátil (também conhecido como POSIX) , consulte especificamente a seção "Pesquisa e execução de comandos".
Reproduzindo o erro
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
NOTA : a mensagem de erro dada por sudo
é obviamente enganosa, portanto, isso deve ser lembrado; no entanto, observe que esse não era o cerne da pergunta que o OP está fazendo.
Documentação e referências
Do bash
manual 4.3, seção "COMMAND EXECUTION":
Se o nome não for uma função de shell nem interno, e não contiver barras, o bash procurará em cada elemento do PATH um diretório que contenha um arquivo executável com esse nome.
De Por que você precisa de ./ (barra) antes do nome do script para executá-lo no bash? :
Ele funciona com ./ porque o POSIX especifica que um nome de comando que contém a / será usado diretamente como um nome de arquivo, suprimindo uma pesquisa em $ PATH. Você poderia ter usado o caminho completo para exatamente o mesmo efeito, mas ./ é mais curto e fácil de escrever.
./
parte do comando está dizendo "Procure no diretório atual e execute o comando 'truecrypt-7.2-setup-x86' daqui". Você precisa executar este comando no diretório em que descompactou o arquivo.