O comportamento que você enfrenta provavelmente depende de diferenças na variável de ambiente $PATH
. O $PATH
é essencialmente uma lista de diretórios separados por dois-pontos, que são pesquisados em ordem para um executável específico quando um programa é invocado usando uma chamada do sistema operacional exec
. O $PATH
pode conter componentes de caminho relativos, normalmente .
ou uma cadeia vazia, que se referem ao diretório de trabalho atual. Se o diretório atual for parte de $PATH
, os arquivos no diretório de trabalho atual poderão ser executados apenas pelo nome, por exemplo, %código%. Se o diretório atual não estiver em a.out
, deve-se especificar um caminho relativo ou absoluto para o executável, por exemplo, $PATH
.
Ter componentes relativos do caminho em ./a.out
tem possíveis implicações de segurança, pois os executáveis nos diretórios anteriores em $PATH
executam os diretórios em diretórios posteriormente na lista. Considere, por exemplo, um ataque a um sistema em que o caminho atual do diretório de trabalho $PATH
precede .
em /bin
. Se um invasor conseguir colocar um script mal-intencionado compartilhando um nome com um utilitário de sistema comumente usado, por exemplo $PATH
, no diretório atual (que geralmente é muito mais fácil substituir binários em ls
de propriedade da raiz), o usuário inadvertidamente, invoca o script malicioso quando a intenção é invocar o sistema /bin
. Mesmo se ls
for anexado apenas no final de .
, um usuário pode ser enganado para invocar inadvertidamente um executável no diretório atual que compartilhe um nome com um utilitário comum não encontrado nesse sistema específico. É por isso que é comum não ter componentes de caminho relativos como parte do padrão $PATH
.