Por que “which” não retorna nenhum em alguns comandos que posso executar? [duplicado]

14
    

Esta pergunta já tem uma resposta aqui:

    
  •              Por que não? qual 'comando funciona para' cd '? Não consigo encontrar o executável para 'cd' também!                                      4 respostas                          
  •     

Eu usei which para informar a localização de um arquivo executável. Por exemplo, which pwd retorna /bin/pwd . No entanto, achei which alias ou which compgen etc não retorna nada.

O que são comandos como alias ? Eles não são arquivos executáveis no meu Linux? Estou usando o bash 4.3 no Ubuntu.

    
por Peng Zhang 19.11.2014 / 04:11

2 respostas

23
  

Eu encontrei which alias ou which compgen etc não retorna nada.

Ambos são construídos em shell. which não sabe nada sobre shell builtins: ele simplesmente procura um caminho para executáveis.

Para um resultado mais confiável, use type .

$ type compgen
compgen is a shell builtin
$ type alias
alias is a shell builtin

type tem melhor conhecimento do que é executado porque é um shell embutido.

Por que which não é confiável

which geralmente fornece a resposta errada. Observe:

$ type pwd
pwd is a shell builtin
$ which pwd
/bin/pwd

Quando você executar pwd , sem especificar um caminho explícito, o shell executará seu builtin, não o executável que which encontrou.

Aqui estão mais exemplos de which dando a resposta errada:

$ type echo
echo is a shell builtin
$ which echo
/bin/echo
$ type [
[ is a shell builtin
$ which [
/usr/bin/[

Observe:

$ type /bin/echo
/bin/echo is /bin/echo

Quando você fornece um caminho explícito para echo , como /bin/echo , então o shell executaria esse executável, não o interno. type sabe disso também, como você pode ver acima.

Como which funciona internamente

Em sistemas parecidos com o debian, which é um shell script simples, cuja parte relevante é:

   for ELEMENT in $PATH; do
    if [ -z "$ELEMENT" ]; then
     ELEMENT=.
    fi
    if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then
     puts "$ELEMENT/$PROGRAM"
     RET=0
     [ "$ALLMATCHES" -eq 1 ] || break
    fi
   done

Como você pode ver, ele faz uma pesquisa simples ao longo do PATH para um arquivo executável do nome dado.

    
por John1024 19.11.2014 / 04:17
0

Acho que isso ocorre porque não há um programa / arquivo chamado alias ou compgen , etc. Eles podem ser apenas keywords que o BASH como um interpretador de idiomas sabe.

Você pode pensar que o BASH é um porgram e alias é apenas um nome de método nesse programa.

    
por champaign 19.11.2014 / 04:17

Tags