Núcleo da pergunta:
A questão surgiu enquanto eu não conseguia instalar o software, por isso estou realmente perguntando sobre ./ porque não sabia e a saída "comando não encontrado" estava me confundindo sobre o que realmente era o comando.
Contexto:
Eu gostaria de instalar o arquivo truecrypt-7.2-setup-x86
.
As instruções dizem para usar o comando:
sudo ./truecrypt-7.2-setup-x86
Mas a saída é:
sudo: ./truecrypt-7.2-setup-x86: command not found
UPDATE: para completar, no teste, eu estava na pasta do arquivo, mas ainda não o havia executável (chmod + x).
./
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.chmod +x
, ochmod -x
é o oposto - ele remove as permissões executáveisRespostas:
./
não é um comando. O comando é./truecrypt-7.2-setup-x86
.Seu shell e programas como
sudo
tratarão um comando como um nome de caminho quando ele contém pelo menos um/
caractere. Como.
representa o diretório em que você está atualmente,./truecrypt-7.2-setup-x86
nomeia o arquivotruecrypt-7.2-setup-x86
no diretório atual. Se esse arquivo não existir ou o arquivo não puder ser executado, você receberá uma mensagem de erro.Quando um comando não contém uma barra, os diretórios listados
$PATH
são pesquisados, como diz Sergiy Kolodyazhnyy . O diretório atual não é automaticamente procurou - e é não recomendado para colocar.
em$PATH
. Dessa forma, você não executa acidentalmente coisas que não esperava executar porque tinhacd
d em um diretório que as contém.Escrever
./
antes do nome de um executável no diretório atual é a maneira comum de executá-lo, mas essa não é realmente uma sintaxe especial. Por exemplo, se você estragou tudo$PATH
e precisava executar um comando comols
, poderia escrever/bin/ls
. Não.
é necessário nesse caso ou em geral; o que é necessário é um/
lugar no nome do caminho para indicar que você quer dizer que é um nome de caminho.Como
.
sempre é o diretório atual e/
é apenas o separador de diretórios, a primeira coisa a fazer é verificar se o arquivo que você nomeou realmente existe no diretório atual. (Se isso acontecer, verifique suas permissões , como Charles Green explica . Mas se você extraiu o arquivo de um arquivo, ele normalmente já terá permissões executáveis, se pretender ser executado.)fonte
A 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.
Isso pode ser testado: Na mesma janela do terminal em que você está tentando o comando, insira o comando
ls -l true*
- se o arquivo estiver presente no diretório de trabalho atual, será exibida uma lista mostrando o arquivo (e várias informações adicionais).Como Zanna observou nos comentários, seu arquivo pode não ter permissões de execução - isso pode ser corrigido facilmente. Como um caso de teste, meu diretório mostra
e o arquivo "rFullBack" lista '-rw-' como minha permissão, para ler e gravar o arquivo. Eu posso executar o comando
chmod +x rFullBack
e a lista de diretórios muda paraLá, minhas permissões agora são '-rwx', indicando que posso executar o arquivo.
Em resumo, se o arquivo existir no seu diretório
execute o comando
e então o comando
fonte
rw-
como sua permissão - o-
antes é para set [gu] id e bits fixos.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
chmod +x ./truecrypt-7.2-setup-x86
, isto diz "torne o arquivo truecrypt-7.2-setup-x86 que está neste diretório executável"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
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":De Por que você precisa de ./ (barra) antes do nome do script para executá-lo no bash? :
fonte
sudo
saída é enganosa. Se você tentar o mesmo semsudo
, você vai ter outro erro debash
:Permission denied
. E com razão, já que você não deu permissão ao script para executar (viachmod +x
).sudo
saída é enganosa é verdade, mas esse é o erro que aparece. Isso pode ser algo a relatar aos desenvolvedores e deixá-los consertá-lo. Entretanto, esse não é o cerne da discussão - precisamos estabelecer o que o OP fez para produzir esse erro e orientá-los para o caminho certo. Seja enganoso ou não - esse não é o problema aqui./bin/bash
: não permite executar um script no qual você não tem permissão de execução. Quando você antecede o nome do script/bin/bash
, o fato de/bin/bash
ser executável é tudo o que importa, pois é o comando que está sendo executado. Quando você não fizer isso, o próprio script está sendo executado, o que por sua vez leva a quer seu shell atual ou o que está no topo#!
de linha que está sendo chamado/bin/bash
é apenas um exemplo aqui. O fato de estarmos chamando/bin/bash
e./script.sh
especificando o caminho para a coisa sendo executada - é o mesmo. Prefácio de um script combash script.sh
ou/bin/bash script.sh
é um tópico totalmente diferente, onde você executa um executável e o passa como argumento - que pode ser interrompido se a sintaxe for escrita para algo diferente do shell que você está chamando, digamoscsh
./bin/bash
é executável, mas o fato é que você ainda está especificando o caminho completo para ele./bin/bash
ou mesmo apenas tambémbash
é uma maneira comum de resolver a falta de permissões executáveis no script. A especificação do caminho completo do script não resolve esse problema. Portanto, é um exemplo particularmente ruim neste caso específico./bin/bash