que comando de console ./ significa?

5

Eu vi muitas vezes comandos do console como

./redis-server

ou

./mongo

o que exatamente ./ significa?

    
por kilonet 14.05.2011 / 12:59

2 respostas

10

. é o diretório atual. Então o comando está dizendo ao shell para procurar o executável no diretório atual.

Não confunda com . foo , que é um comando completamente diferente.

    
por 14.05.2011 / 13:00
10

Quando você executar um comando sem nenhum prefixo, os sistemas Unix procurarão o comando em PATH . Por exemplo, se você digitar ls , o Unix percorrerá todos os caminhos listados em PATH para localizar o binário ls .

Por exemplo, vamos supor que seu PATH esteja definido como /bin:/usr/bin:/usr/local/bin , então digitar ls fará com que seu shell encontre o comando em /bin/ls e o execute.

Os sistemas Unix devem avaliar os caminhos na ordem em que estão listados em PATH . Portanto, se você tiver vários ls instalado, ele executará o primeiro encontrado, ignorando os outros. Portanto, no exemplo acima, você pode ter outro ls instalado em /usr/local/bin/ls , que nunca é usado se você digitar apenas ls . Se você quiser executar /usr/local/bin/ls , então você pode modificar PATH ou usar o caminho absoluto digitando /usr/local/bin/ls .

Agora chega ao seu prefixo ./ . O . está simplesmente referindo a pasta atual. Portanto, se você prefixar um comando com ./ , seu shell procurará o comando na pasta atual. Na verdade

./command

é idêntico a

'pwd'/command

ou (na BASH)

${PWD}/command

Como já foi mencionado na linha de comando do Windows, você pode usar apenas command se quiser executar command.exe da pasta atual. Isso ocorre porque o Windows primeiro procura implicitamente na pasta de trabalho atual para o binário antes de pesquisar o caminho.

Infelizmente isso é bastante inseguro. Vamos imaginar que gostaria de roubar informações do usuário às quais não tenho acesso como usuário normal. Vou apenas colocar um script muito simples em meu diretório pessoal chamado 'ls' com o seguinte conteúdo:

#!/bin/bash
cp /etc/shadow /home/my-user > /dev/null 2>&1
chown my-user /home/my-user/shadow > /dev/null 2>&1
/bin/ls $*

Em seguida, torne-o executável.

Depois, ligo para o administrador do sistema e conto-lhe uma história sobre alguns nomes de arquivos bastante estranhos no meu diretório pessoal. É muito provável que o administrador faça o login no shell (espero que seja como root) no meu diretório e execute ls . O que aconteceria é que, em vez de /bin/ls , o administrador do sistema executaria meu script ls , que apenas coloca uma cópia de /etc/shadow em minha pasta pessoal. Bem, o administrador provavelmente se perguntaria por que esse ls não listará os nomes dos arquivos. Assim, o script apenas executa o comando "real" /bin/ls na última linha.

Assim, para evitar tais problemas, a maioria dos sistemas Unix modernos não inclui o diretório atual ( . ) no caminho de pesquisa. Basicamente, se um comando é executado sem especificar o caminho completo, o shell apenas executará binários dentro do caminho que normalmente inclui apenas caminhos confiáveis (não graváveis pelo usuário). Quando você vê ./mongo em uma documentação, isso significa apenas que você deve certificar-se de que mongo da pasta correta seja executada, e não algum mongo binário em algum lugar no caminho.

Se você costuma executar binários a partir do caminho atual, pode simplesmente adicionar "." para a lista PATH manualmente:

export PATH=".:$PATH"

A partir de agora, o shell sempre procurará binários no diretório atual primeiro. Como escrito acima, isso é altamente perigoso, pois você deve verificar o diretório de trabalho atual para binários toda vez que executar um comando - mesmo antes de executá-lo. Infelizmente, para checar o diretório atual para binários, usaria o 'ls' que já poderia executar um binário que você não esperaria.

Pessoalmente, utilizo frequentemente o seguinte na minha $HOME/.profile :

export PATH="~/bin:$PATH"

Isso me permite colocar alguns scripts na minha pasta $HOME/bin e executá-los sem precisar especificar o caminho completo. Mas lembre-se que $HOME/bin é um caminho confiável para mim também.

Outra pequena nota. Cada diretório (mesmo os vazios) contém dois links físicos. Verifique ls -a output:

.
..

A entrada . refere-se ao diretório atual enquanto a entrada .. é vinculada ao diretório pai. Isso está habilitando caminhos relativos. Claro que também permite definições recursivas como ././././././command executar command como . sempre se refere ao mesmo diretório. Você também pode executar algo como /bin/../bin/./././../bin/ls , que é totalmente válido.

Espero que isso esclareça um pouco sobre o que são as entradas . e .. .

    
por 15.05.2011 / 18:44

Tags