Qual é a diferença entre nome do arquivo e ./filename no Linux

10

Qual é a diferença entre filenamee ./filename? Sob quais circunstâncias uma é preferida à outra?

na hora certa
fonte

Respostas:

18

Para arquivos de dados, isso não faz diferença - as duas instruções referenciarão o arquivo de dados no diretório atual. (Por exemplo, cat filenamee cat ./filenamesão semanticamente idênticos.)

É uma história diferente se o nome do arquivo em questão se referir a um executável , ou seja, é a primeira (ou mesmo única) coisa que você digita na linha de comando. ./filenameprocurará o executável em seu diretório atual e em nenhum outro lugar. filename, por outro lado, avaliará a variável de ambiente PATHe procurará filenameem todos os diretórios armazenados nela (que podem ou não incluir seu diretório atual).

./filename(ou qualquer outro /path/to/filename) é, portanto, preferido quando você deseja executar um executável específico , não o primeiro encontrado em seu PATH.

DevSolar
fonte
6

Se você estiver executando um programa, filenamediz para executar o primeiro encontrado no seu $PATHe o segundo diz para executar o programa no diretório atual.

Se você estiver usando esse nome de arquivo como argumento para um programa como em do_something filenameou do_something ./filenameentão eles significam a mesma coisa.

Pausado até novo aviso.
fonte
5

Você está se referindo à execução de comandos, certo?

Há uma variável de ambiente PATHque contém alguns diretórios do sistema, delimitados por ponto e vírgula. Quando você digita, commando sistema procura nesses diretórios na ordem em que são especificados para localizar um arquivo executável chamado <comando>. Se o encontrar, ele tenta executá-lo. Você pode ver seu PATH via echo $PATHno bash. Por exemplo:

$ echo $ PATH
/ sbin: / bin: / usr / sbin: / usr / bin: / usr / jogos: / usr / local / sbin: / usr / local / bin: / home / ivanatora / bin: / usr / local / kde4 / bin: / usr / local / kde4 / bin

Quando você digita, ./filenameestá especificando o caminho exato: o diretório atual. Você pode ver que o diretório atual raramente está no seu $ PATH (por motivos de segurança). Portanto, se você deseja executar um arquivo a partir do diretório atual, use ./filename.

Para executar um arquivo por seu caminho (especialmente se não estiver em $ PATH), você também pode digitar <path>/file, como:

/ sbin / ifconfig

Ivan Petrushev
fonte
3

A segurança executável é o principal motivo dessa diferença.

Você não quer . (apresente o diretório de trabalho ou o PWD) no seu caminho, porque alguém poderia trojan http://en.wikipedia.org/wiki/Trojan_horse_%28computing%29 um executável crucial como ps ou ls, no seu PWD e enganá-lo, apresentando dados incorretos.

bitbucket
fonte
1

Depende de quais circunstâncias você está usando isso.

Como argumento, por exemplo, "nome do arquivo do programa", depende do programa, mas geralmente eles são idênticos.

Como um nome de programa, por exemplo, "argumentos do nome do arquivo", então "argumentos do nome do arquivo" pesquisará PATH para encontrar o binário, enquanto "./ argumentos do nome do arquivo" usará o programa no diretório atual. Isto é obviamente útil se. não está no PATH, mas também é útil usá-lo, mesmo que seja. está no caminho, talvez porque corresponda a uma entrada anterior.

gorila
fonte