'which', mas todos

18

Acho que a maioria está familiarizada com o comando which e eu o uso com frequência. Acabei de me deparar com uma situação em que estou curioso não apenas qual comando é o primeiro no meu caminho, mas quantos e onde todos os comandos em todos os meus caminhos são. Eu tentei o que man page (digitando man which me fez rir), mas não vi nada.

    
por kenny 20.03.2011 / 00:29

4 respostas

21

Em alguns sistemas, which -a mostra todas as correspondências. Se o seu shell é bash ou zsh¹, você pode usar type : type foo mostra a primeira correspondência e type -a foo mostra todas as correspondências. Os três comandos type , which e whence fazem basicamente a mesma coisa; eles diferem entre shells e sistemas operacionais em disponibilidade, opções e o que exatamente eles relatam. type está sempre disponível e mostra todos os nomes possíveis de comandos (aliases, palavras-chave, shell built-ins, funções e comandos externos).

A única maneira totalmente portátil de exibir todas as correspondências é analisar $PATH . Aqui está um script de shell que faz isso. Se você fizer uma função de shell, coloque o corpo da função entre parênteses (para que a alteração para IFS e set -f não escape da função) e altere exit para return .

#!/bin/sh
set -f       # disable globbing
IFS=:        # break words at : only
not_found=1
for d in $PATH; do
  if [ -f "$d/$x" ] && [ -x "$d/$x" ]; then
    printf '%s\n' "$d/$x"
    not_found=0
  fi
done
exit $not_found

Ou ksh 93, de acordo com a documentação, embora o ksh 93s + 2008-01-31 imprima apenas o primeiro jogo quando eu tento.

    
por 20.03.2011 / 01:24
5

O sinalizador --all ou -a mostrará todas as correspondências em seu caminho e aliases (pelo menos no Fedora, Ubuntu e CentOS):

which -a which

No AIX e no Solaris, isso aproximará você:

echo "$PATH" | sed -e 's/:/ /g' | \
while read -r p; do find "$p" -type f -name "which"; done
    
por 20.03.2011 / 00:52
1

Se você não tem um which support -a ou whence disponível, gere o seu próprio:

#!/bin/sh -f

IFS=":"
for PART in $PATH
do
  if test -x "$PART/$1"
  then
    echo $PART/$1
  fi
done
    
por 21.03.2011 / 11:37
0

ksh e zsh tem "whence" como um shell embutido. whence -a faz o que você quer em zsh:

 7:27AM 7 % whence -a cat
/usr/bin/cat
/bin/cat
/usr/bin/cat
/bin/cat

Eu tenho que limpar o PATH em zsh, eu tenho muitos duplicados nele. whence -a funciona de maneira diferente em ksh:

$ whence -a cat
cat is a tracked alias for /usr/bin/cat

Eu tenho que dizer, que parece ser um comportamento potencialmente útil também.

    
por 20.03.2011 / 14:34

Tags