Por que "./" é usado ao executar um programa?

Por que "./" é usado ao executar um programa?

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 lscom 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 slcomando 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 lsnaquele diretório. Porque bashprocuraria no diretório atual (.)primeiro– antes de procurar nos diretórios do sistema com o arquivo ls.

informação relacionada