diferença entre executável e ./executável

1

Em alguns casos, preciso usar ./executable em vez de simplesmente executable ao executar um arquivo no bash. O que exatamente é a diferença e como eu sei qual devo usar?

Por exemplo, eu tenho uma pasta executável adb in DEV/ADT/sdk/platform-tools .

No bash, se eu inserir adb e executá-lo, recebo o erro: The program 'adb' is currently not installed. You can install it by typing: apt-get install android-tools-adb

Mas se eu digitar ./adb , funcionará perfeitamente.

    
por faizal 12.07.2014 / 20:50

2 respostas

1

O primeiro ponto principal é que ./ especifica o diretório atual ou de trabalho, ou seja, o diretório em que você está agora, que também é aquele que você vê se digitar o comando pwd (print working directory) . Tendo isso em mente, o bash funciona de duas maneiras:

  • Se você especificar um executável vazio, como adb , em que nenhum diretório é fornecido, o bash pesquisará os diretórios listados no PATH do sistema para um executável desse nome e executará o primeiro executável que encontrar.

    Para ver quais diretórios estão no sistema PATH, execute

    echo $PATH
    
  • Se você especificar um executável com um diretório, como ./ no seu caso, o bash procurará apenas um executável nesse diretório. Se não estiver lá, ele pára com um erro.

No seu caso, você estava na pasta DEV/ADT/sdk/platform-tools onde o executável, adb , estava localizado. Então, quando você digita ./adb , o bash procura por adb no diretório atual e, se o encontrar, ele o executa.

Como alternativa, quando você digita adb , o bash examina os diretórios no PATH. Como DEV/ADT/sdk/platform-tools aparentemente não está no PATH, ele não encontra o executável e reclama.

Geralmente, as pessoas evitam esse problema colocando o diretório atual em seu PATH por meio de algo como:

PATH="$PATH:."

Depois disso, quando você digitar o nome do executável, como adb , o bash irá procurá-lo, como antes, ao longo do PATH. Mas como o PATH agora inclui o diretório atual, ele também aparecerá lá.

A adição de . ao PATH é comumente feita para usuários pessoais. Como é mais perigoso quando o root executa o executável incorretamente, isso geralmente não é feito para o root.

    
por John1024 12.07.2014 / 21:04
1

O motivo é que, se você não começar com ./ , ele pesquisará o PATH para executable - você poderá ver seu atual PATH executando echo $PATH - exemplo output:

/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/wilf/.local/bin:/usr/games

Então, se você quiser adicionar DEV/ADT/sdk/platform-tools ao seu PATH, adicione o seguinte em ~/.bash_profile (talvez seja necessário executar source ~/.bash_profile primeiro, ou efetuar logout e login) :

PATH=$PATH:DEV/ADT/sdk/platform-tools

Outro exemplo para ~/.local/bin :

PATH=$PATH:$HOME/.local/bin

Se você prefixar com ./ , ele procurará no diretório de trabalho atual (você pode encontrá-lo com echo $PWD , pwd , etc) para o arquivo.

    
por Wilf 12.07.2014 / 21:04