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 .