Como o shell interpreta ././command-name?

3

Eu tenho um arquivo binário chamado hello2 no meu diretório de trabalho atual.

Para executá-lo eu preciso pressionar ./hello2 e mostra a saída.

Mas quando eu uso o seguinte comando ././hello2 , ele ainda funciona.

Você pode explicar como o shell está interpretando este comando?

    
por Md. Alamin Mahamud 01.09.2017 / 16:55

3 respostas

8

Quando você executa o comando

$ ./hello2

o shell pesquisa o arquivo hello2 no diretório . , ou seja, no diretório atual . Em seguida, ele executa o script ou o binário de acordo com algumas regras (que não são interessantes nesse contexto).

O comando

$ ././hello2

também faz com que o shell execute o arquivo.

Isso ocorre porque . e ./. é o mesmo diretório.

Todo diretório possui uma entrada de diretório . . Esta entrada corresponde ao próprio diretório. Então, dizer ./ é o mesmo que dizer ././ e ././././ etc.

A única diferença é que o sistema pode ter que fazer algumas pesquisas de diretórios extras (a menos que o shell seja inteligente e identifique a simplificação óbvia).

Todo diretório também possui uma entrada .. que aponta para seu diretório pai .

Isso significa que se o diretório atual for chamado alamin , o seguinte também executaria o arquivo:

$ ../alamin/hello2

como seria

$ ../alamin/./hello2

e

$ .././alamin/./hello2

O diretório raiz, / , é um caso especial. Sua entrada de diretório .. é igual à entrada de diretório . . Isso significa que você não pode ir "acima" com /.. .

Veja também: O número de links para uma pasta não reflete o status real?

    
por 01.09.2017 / 17:02
3

Ao digitar o nome de um comando, digamos hello , o sistema procurará o arquivo em PATH , que deve ter a seguinte aparência:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Se o sistema não puder encontrar o comando nesses diretórios, você receberá um erro command not found .

Ao prefixar ./ no comando, você está dizendo para limitar a pesquisa ao diretório atual.

Todo diretório tem uma entrada . , correspondente ao próprio diretório, então tudo o que você está fazendo digitando ././hello ainda está limitando a consulta do comando no próprio diretório (duas vezes).

Tente cd ./././././ .

    
por 01.09.2017 / 17:09
1

As respostas estão corretas, mas eu gostaria de dizer uma coisa diferente. Execute o seguinte comando,

┌─[luvpreet@DHARI-Inspiron-3542] - [~/Desktop/drf-vogo] - [2017-09-01 08:57:42]
└─[0] ls -la
total 60
drwxrwxr-x 14 luvpreet luvpreet 4096 Aug 14 15:30 .
drwxr-xr-x 21 luvpreet luvpreet 4096 Sep  1 00:27 ..

Você notará que as duas primeiras linhas têm . e ..

Agora, esse . é o ponteiro para o diretório atual em que você está. E .. é o ponteiro para seu diretório pai.

Quando você faz cd .. ,

monitoring-server@monitoring-server:~/kibana-project$ cd ..
monitoring-server@monitoring-server:~$ 

Move-se para o diretório pai.

Quando você faz cd . ,

monitoring-server@monitoring-server:~/kibana-project$ cd .
monitoring-server@monitoring-server:~/kibana-project$ 

Ele permanece no mesmo diretório.

Agora, ../testfile.txt está apontando para o arquivo testfile.txt no diretório pai. E ./testfile.txt está apontando para o testfile no diretório atual.

Portanto, ././././././././ , tanto quanto possível, permanece no mesmo diretório.

E ../../../../ continuará em um nível até o diretório pai.

    
por 01.09.2017 / 17:35