Например, если в качестве входных данных передано ls
оно должно сказать мне, что /bin/ls
запустится, если в командной строке запустить ls
.
4 ответа
Используемая команда варьируется от оболочки к оболочке.
Только встроенная оболочка скажет правильно, что будет делать оболочка для данного имени команды, поскольку только встроенные модули могут полностью знать об алиасах, функциях оболочки, других встроенных модулях и т.д. Помните: во-первых, не все команды соответствуют исполняемым файлам.
Для оболочки Bourne Again,
bash
, встроенной является командаtype
:$ type '[' [ is a shell builtin
Для рыбных раковин,
fish
, встроенныйtype
работает аналогично bash. Чтобы получить только путь к исполняемому файлу, используйтеcommand -v
:$ type cat cat is /bin/cat $ command -v cat /bin/cat
Для оболочки Korn,
ksh
, встроенной является командаwhence
- сtype
изначально настроенным как обычный псевдоним дляwhence -v
и встроеннойcommand
с параметром-v
эквивалентнымwhence
:$ whence -v ls ls is a tracked alias for /bin/ls
Для оболочки Z,
zsh
, встроенной является командаwhence
, сcommand
встроенной с опцией-v
эквивалентнойwhence
и встроеннымtype
,which
иwhere
эквивалентноwhence
с опциями-v
,-c
и-ca
соответственно.$ whence ls /bin/ls
Для TC Shell,
tcsh
, встроенной является командаwhich
не следует путать ни с какой внешней командой с таким именем:> which ls ls: aliased to ls-F > which \ls /bin/ls
дальнейшее чтение
Вы можете использовать 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 -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