Odpowiedzi:
Tylko wbudowana powłoka powie jednemu poprawnie, co zrobi powłoka dla danej nazwy polecenia, ponieważ tylko wbudowane mogą w pełni wiedzieć o aliasach, funkcjach powłoki, innych wbudowanych itd. Pamiętaj: przede wszystkim nie wszystkie polecenia odpowiadają plikom wykonywalnym.
Dla Bourne Again Shell, bash
, wbudowany jest type
polecenie:
$ type '['
[ is a shell builtin
Dla ryb skorupach,fish
The type
wbudowane działa podobnie do bash. Aby uzyskać tylko ścieżkę do pliku wykonywalnego, użyj command -v
:
$ type cat
cat is /bin/cat
$ command -v cat
/bin/cat
Dla powłoki Korn ksh
, wbudowany jest whence
komenda - z type
wstępnie skonfigurować jako zwykły alias whence -v
a command
wbudowany z -v
ekwiwalentu opcja whence
:
$ whence -v ls
ls is a tracked alias for /bin/ls
Dla Z Shell zsh
, wbudowany jest whence
komenda, z command
wbudowaną z -v
ekwiwalentu opcja whence
a wbudowany ins type
, which
i where
równoważna whence
z opcjami -v
, -c
i -ca
odpowiednio.
$ whence ls
/bin/ls
Dla TC Shell tcsh
, wbudowany jest which
polecenie - nie mylić z dowolnego zewnętrznego polecenia o tej samej nazwie:
> which ls
ls: aliased to ls-F
> which \ls
/bin/ls
type
jest również wbudowany w Zsh?
which-2.19-6.el6.x86_64
) Umieszcza plik startowy /etc/profile.d/which2.sh
. Jest to odczytywane przez powłoki inne niż csh, w tym zsh. Alias which
do siebie. W szczególności dla użytkowników zsh zastępuje on wbudowane funkcje which
.
Możesz użyć which
do tego:
aix@aix:~$ which ls
/bin/ls
Działa poprzez wyszukiwanie PATH
plików wykonywalnych pasujących do nazw argumentów. Zauważ, że nie działa z aliasami powłoki:
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
działa jednak:
aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
which
samo w sobie niekoniecznie wystarcza. Zwraca tylko pierwszą znalezioną nazwę w $ PATH ... Ta nazwa może być dowiązaniem symbolicznym, a nie rzeczywistym plikiem wykonywalnym końca łańcucha .
which
czy nie (koniecznie) zwracają plik wykonywalny. Zwraca pierwszą pasującą nazwę pliku, którą znajdzie w zmiennej $ PATH (lub wiele podobnych nazwanych plików podczas używania which -a
) ... Rzeczywisty plik wykonywalny może być oddalony o wiele linków.
which locate
/usr/bin/locate
file $(which locate)
/usr/bin/locate: symbolic link to /etc/alternatives/locate'
Polecenie, które znajduje się rzeczywistą wykonywalnego readlink -e
,
(w połączeniu z which
)
readlink -e $(which locate)
/usr/bin/mlocate
Aby zobaczyć wszystkie linki pośrednie :
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
Możesz spróbować:
whereis ls
To daje mi:
ls: /bin/ls /usr/share/man/man1/ls.1.gz