Respostas:
Somente um shell embutido dirá a alguém corretamente o que o shell fará por um determinado nome de comando, uma vez que somente os embutidos podem saber completamente sobre aliases, funções do shell, outros embutidos e assim por diante. Lembre-se: nem todos os comandos correspondem aos arquivos executáveis em primeiro lugar.
Para o shell Bourne Again bash
, o built-in é o type
comando:
$ type '['
[ is a shell builtin
Para a concha de peixefish
type
,, O builtin funciona da mesma forma que o bash. Para obter apenas o caminho de um executável, use command -v
:
$ type cat
cat is /bin/cat
$ command -v cat
/bin/cat
Para a Shell Korn, ksh
, o built-in é o whence
comando - com type
criado inicialmente como um apelido comum para whence -v
e do command
built-in com a -v
opção equivalente a whence
:
$ whence -v ls
ls is a tracked alias for /bin/ls
Para a Z Shell, zsh
, o built-in é o whence
comando, com o command
built-in com a -v
opção equivalente ao whence
e as built-ins type
, which
e where
equivalente a whence
com as opções -v
, -c
e, -ca
respectivamente.
$ whence ls
/bin/ls
Para a Shell TC, tcsh
, o built-in é o which
comando - para não ser confundido com qualquer comando externo por esse nome:
> which ls
ls: aliased to ls-F
> which \ls
/bin/ls
type
também está embutido no zsh?
which-2.19-6.el6.x86_64
) coloca um arquivo de inicialização /etc/profile.d/which2.sh
. Isso é lido por shells não-csh, incluindo zsh. Alias which
para si mesmo. Portanto, para usuários do zsh, em particular, ele substitui as quebras internas which
.
Você pode usar which
para isso:
aix@aix:~$ which ls
/bin/ls
Ele funciona pesquisando os PATH
arquivos executáveis que correspondem aos nomes dos argumentos. Observe que isto não funciona com aliases de shell:
aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin dev initrd.img lib32 media proc selinux tmp vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$
type
, no entanto, funciona:
aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
which
não é necessariamente suficiente por si só. Ele retorna apenas o primeiro nome encontrado em $ PATH ... Esse nome pode ser um link simbólico, e não o executável final de cadeia .
which
se não (necessariamente) voltar o arquivo executável. Ele retorna o primeiro nome de arquivo correspondente encontrado em $ PATH (ou vários arquivos nomeados semelhantes ao usar which -a
) ... O executável real pode estar a vários links de distância.
which locate
/usr/bin/locate
file $(which locate)
/usr/bin/locate: symbolic link to /etc/alternatives/locate'
O comando que encontra o real executável é readlink -e
,
(em conjugação com o which
)
readlink -e $(which locate)
/usr/bin/mlocate
Para ver todos os links intermediários :
f="$(which locate)" # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do # follow links to executable
printf "# %s\n" "$f"
done
# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate
Podes tentar:
whereis ls
Isso me dá:
ls: /bin/ls /usr/share/man/man1/ls.1.gz