Ответы:
Только встроенная оболочка скажет правильно, что будет делать оболочка для данного имени команды, поскольку только встроенные модули могут полностью знать об алиасах, функциях оболочки, других встроенных модулях и т. Д. Помните: во-первых, не все команды соответствуют исполняемым файлам.
Для Bourne Again оболочки bash
, встроенный является type
команда:
$ type '['
[ is a shell builtin
Для рыбы оболочкиfish
, The type
встроенный работает аналогично Баш. Чтобы получить только путь к исполняемому файлу, используйте command -v
:
$ type cat
cat is /bin/cat
$ command -v cat
/bin/cat
Для Korn Shell, ksh
, встроенный является whence
команда - с type
первоначально установлен как обычный псевдоним whence -v
и command
встроенный с -v
опцией , эквивалентной whence
:
$ whence -v ls
ls is a tracked alias for /bin/ls
Для Z Shell, zsh
, встроенные в это whence
команда, с command
встроенным с -v
опцией эквивалентных whence
и встроенными модулями type
, which
и where
эквивалентен whence
с параметрами -v
, -c
и -ca
соответственно.
$ whence ls
/bin/ls
Для ТС Shell, tcsh
, встроенные является which
команда - не следует путать с любой внешней командой с таким именем:
> which ls
ls: aliased to ls-F
> which \ls
/bin/ls
type
также встроен в Zsh?
which-2.19-6.el6.x86_64
) помещает файл запуска /etc/profile.d/which2.sh
. Это читается не-csh оболочками, включая zsh. Это псевдонимы which
для себя. Так что для пользователей Zsh, в частности, он переопределяет разрывы встроенного which
.
Вы можете использовать which
для этого:
aix@aix:~$ which ls
/bin/ls
Он работает путем поиска PATH
исполняемых файлов, соответствующих именам аргументов. Обратите внимание, что это не работает с псевдонимами оболочки:
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
Однако работает:
aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
which
не обязательно достаточно само по себе. Он возвращает только первое найденное имя в $ PATH ... Это имя может быть символической ссылкой, а не фактическим исполняемым файлом конца цепочки .
which
это не (обязательно) возвращает исполняемый файл. Он возвращает первое совпадающее имя файла, которое он находит в $ PATH (или несколько похожих именованных файлов при использовании which -a
) ... Фактический исполняемый файл может содержать несколько ссылок.
which locate
/usr/bin/locate
file $(which locate)
/usr/bin/locate: symbolic link to /etc/alternatives/locate'
Команда, которая находит фактический исполняемый файл readlink -e
,
(в сочетании с which
)
readlink -e $(which locate)
/usr/bin/mlocate
Чтобы увидеть все промежуточные ссылки :
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
Можешь попробовать:
whereis ls
Это дает мне:
ls: /bin/ls /usr/share/man/man1/ls.1.gz