Qual é a diferença entre filename e ./filename no Linux?

10

Qual é a diferença entre filename e ./filename ? Em que circunstâncias prefere-se um ao outro?

    
por justintime 23.04.2010 / 15:59

5 respostas

18

Para arquivos de dados, não faz diferença - ambas as instruções referenciarão o arquivo de dados em seu 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 refere a um executável , ou seja, é a primeira (ou até 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 (o que pode ou não incluir seu diretório atual).

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

    
por 23.04.2010 / 16:06
6

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

Se você estiver usando esse nome de arquivo como um argumento para um programa como em do_something filename ou do_something ./filename , eles significam a mesma coisa.

    
por 23.04.2010 / 16:05
5

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

Existe 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 esses diretórios na ordem em que são especificados para localizar um arquivo executável chamado < command > Se encontrá-lo, 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/games:/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á em seu $ PATH (por motivos de segurança). Portanto, se você quiser executar um arquivo do diretório atual, use ./filename .

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

/sbin/ifconfig

    
por 23.04.2010 / 16:06
3

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

Você não quer. (presente diretório de trabalho ou PWD) em seu caminho porque alguém poderia trojan link um executável crucial, como ps ou ls, em sua PWD e enganar você apresentando dados inválidos.

    
por 23.04.2010 / 23:38
1

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

Como argumento, por exemplo, "program filename", então depende do programa, mas geralmente são idênticos.

Como um nome de programa, por exemplo "argumentos de nome de arquivo", então "argumentos de nome de arquivo" procurarão PATH para achar o binário, enquanto "argumentos de ./filename" usarão o programa no diretório atual. Isso é obviamente útil se. não está no PATH, mas também é útil usar este mesmo. está no caminho, talvez porque corresponda a uma entrada anterior.

    
por 23.04.2010 / 16:05