Uso de ./ na execução do código compilado

5

Por que usamos ./ antes de executar um código compilado no linux? Não parece necessário se eu estiver em um diretório maior do que aquele que tem código compilado. Deixe-me explicar pelo exemplo. Se meu código estiver em / home / uname / code , e eu também estiver no mesmo diretório, eu tenho que usar ./ a.out . Mas se eu estiver em / home / uname / , posso usar ./code / a.out . Aqui estou usando ./ mas acho que é mais para navegar pelos diretórios e não como uma indicação de que ele tem que executar um código. Então, por que eu preciso usar ./ para executar um código compilado se eu estiver no mesmo diretório que o código?

    
por Kaustubh Kaluskar 11.03.2013 / 18:06

3 respostas

4

Quando você emite um comando, seu shell faz um truque para parecer que você pode simplesmente chamar o comando sem especificar seu caminho completo. O shell procura o comando em cada um dos diretórios listados na variável de ambiente $PATH e, se for localizado, organiza a execução do comando.

Se você deseja executar um comando que não esteja em um dos diretórios em $PATH , é necessário fornecer ao shell uma dica onde encontrar o arquivo. No seu caso de exemplo, como /home/uname/code não está em $PATH , você precisa fornecer ao shell informações suficientes sobre o caminho para localizar o arquivo que deseja executar. Isso é verdade se o seu diretório de trabalho atual for o diretório onde o arquivo está localizado ou em qualquer outro diretório. Se você estiver no mesmo diretório que o arquivo que deseja executar, o ./ antes do nome do arquivo é suficiente para informar ao shell onde encontrar o arquivo.

    
por 11.03.2013 / 18:17
1

A entrada do shell é sempre um caminho para um executável; absoluto ou relativo. Isso tem que ser composto de diretório-caminho / nome do arquivo. Se você especificar apenas um nome de arquivo executável em seu diretório atual, o shell prefixará automaticamente a cadeia inserida com cada um dos diretórios no $PATH . É por isso que você sempre precisa inserir um caminho.

BTW, se seu código estiver em /home/uname/code/ e você estiver em /home/uname/ , você não precisará necessariamente usar

./code/a.out
você também pode usar apenas
code/a.out
porque também é um caminho relativo.     
por 11.03.2013 / 18:36
0

Se which não puder encontrar seu executável, o seu shell também não.

which ./a.out funciona, assim como which ./code/a.out - eles imprimem o caminho completo para o executável - mas não which a.out .

Como outros apontaram, isso funcionaria se você alterasse sua variável de ambiente PATH antes de chamar o programa relevante.

por exemplo. Em código%:

[uname@host:/home/uname/code]$ echo $PATH
/usr/bin:/bin
[uname@host:/home/uname/code]$ which a.out
which: no a.out in (/usr/bin:/bin)

[uname@host:/home/uname/code]$ which ./a.out
/home/uname/code/a.out

# add present directory to path
[uname@host:/home/uname/code]$ export PATH="${PWD}:${PATH}"

[uname@host:/home/uname/code]$ echo $PATH
/home/uname/code:/usr/bin:/bin

[uname@host:/home/uname/code]$ which a.out
/home/uname/code/a.out
    
por 11.03.2013 / 18:57

Tags