Se eu tenho um programa chamado foo, por que preciso dizer ./foo e não simplesmente foo? ./ não significa apenas dentro do diretório atual?
Responder1
Quando você digita apenas um comando – por exemplo. foo
– o shell (normalmente bash
) irá procurá-lo apenas em determinados diretórios – como /bin, /usr/bin, /usr/X11R6/bin e assim por diante. Normalmente seránãoprocure em seu "diretório atual" (ou seja, "." ) por questões de segurança (especialmentese vocês sãoraiz). Se "." é adicionado, ele deve ser adicionado ao fim deo caminho de pesquisa.
Se você quiser executar um executável que sejanãoneste caminho de pesquisa, você precisa especificar todo o caminho absoluto ou relativo para o comando. Por exemplo:
/home/bok/foo # Absolute in my homedir
~/src/bar # Shorthand for my homedir and a subdir in it
../Download/foobar # Relative path – up one step, then down in Download
Ou – se o comando estiver no meu diretório atual – simplesmente adicione ./
:
./foo
O caminho de pesquisa bash
é armazenado noCAMINHOvariável ambiental, então você pode vê-la digitando:
echo $PATH
Adicionar "." – o que você realmentenão deveriafazer – digite:
export PATH="$PATH:."
O PATH é pesquisado em ordem, portanto se existirem vários executáveis com o mesmo nome em diretórios diferentes, é aquele que estiver primeiro no diretório no PATH que o shell irá executar.
Primeiro, depois de procurar em todos os diretórios listados, você receberá um erro de “comando não encontrado”.
+++
O problema de adicionar o diretório atual – .
– ao PATH é que você realmente não sabe se um executável em um diretório "não padrão" em que você esteja deve ser executado ou não.
Digamos que eu seja mau e crie um programa destrutivo que exclua tantos arquivos quanto possível e os deixe em meu diretório pessoal – ou pior, em /tmp... Eu chamo esse programa sl
– um tipo de falha comum ls
– e espero.
Algum usuário aleatório está em /tmp e errou a ortografia ls
com sl
. Com um PATH normal – sem . – nada acontece, exceto que ele recebe um erro de “comando não encontrado”. Se ele conseguiu '.' no final de seu PATH, ele não receberá um erro ao digitar o comando. Em vez disso, meu sl
comando será executado e excluirá todos os arquivos que ele possui. Se ele estiverraiz, o comando poderá excluir grande parte do sistema. (Isso é por queraiz realmente deveriafaça disso uma regrasempreuse ocaminho completode comandos, em vez de confiar em PATH.)
Se ele tivesse colocado '.' primeiro no PATH dele e eu fiz um programa chamado ls
(ortografia correta) e coloquei em um diretório, então ficariameuprograma – não o normal ls
– que seria executado se ele digitasse ls
naquele diretório. Porque bash
procuraria no diretório atual (.)primeiro– antes de procurar nos diretórios do sistema com o arquivo ls
.