Qual é a diferença entre filename
e ./filename
? Sob quais circunstâncias uma é preferida à outra?
Qual é a diferença entre filename
e ./filename
? Sob quais circunstâncias uma é preferida à outra?
Respostas:
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 filename
e cat ./filename
sã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. ./filename
procurará o executável em seu diretório atual e em nenhum outro lugar. filename
, por outro lado, avaliará a variável de ambiente PATH
e procurará filename
em 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.
Se você estiver executando um programa, filename
diz para executar o primeiro encontrado no seu $PATH
e 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 filename
ou do_something ./filename
então eles significam a mesma coisa.
Você está se referindo à execução de comandos, certo?
Há uma variável de ambiente PATH
que contém alguns diretórios do sistema, delimitados por ponto e vírgula. Quando você digita, command
o 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 $PATH
no 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, ./filename
está 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
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.
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.