Мені потрібно знайти шлях заданої програми на PATH
скрипті оболонки. Шлях повинен бути фактичним повним шляхом програми, який може бути переданий пізніше до однієї з exec*
функцій, яка не шукає PATH
себе, наприклад execv
.
Є такі програми kill
, які доступні як фактична програма, так і вбудована оболонка одночасно. У такому випадку мені потрібен повний шлях до фактичної програми.
Існує кілька утиліт, які можуть знайти програму, PATH
як зазначено в Розділі 2.9.1.1, Пошук команд та виконання стандарту POSIX .
Є which
, що не є частиною жодного стандарту. Це може бути звичайною програмою для деяких систем, тоді як деякі оболонки передбачають, що це вбудований. Здається, вона доступна для більшості систем та оболонок, але оболонки із вбудованою версією також просто повертають назву вбудованого замість шляху до виконуваного файлу. Крім того, він ні в якому разі не стандартизований і може повертати будь-який вихід і приймати різні варіанти.
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
Є whence
, яка є вбудованою з кількох оболонок. Але недоступний на багатьох оболонках. Це занадто поверне ім'я вбудованого замість шляху до програми. А -p
може бути передано, куди можна змінити цю поведінку.
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
Є command
вбудований, визначений POSIX: 2008 . На жаль, він також здійснює пошук регулярних команд і вбудованих модулів і поверне ім'я вбудованого замість шляху до програми, затіненої однойменною вбудованою програмою. Деякі старі оболонки ще не реалізували його.
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
realpath
enable
надає лише bash
таzsh
type -p
. І bash, і dash дозволяють вам сказати command
команду для запуску фактичного виконуваного файлу, навіть якщо є функція або вбудований з тим самим іменем.
command
пропускає функції (і псевдоніми), але НЕ є вбудованими, як правильно пише Q. І ви не завжди можете використовувати шебанг, тому що в усіх системах немає шляху, який отримує якусь оболонку або навіть якусь оболонку POSIX.
enable
вказано він у POSIX чи ні, але якщо він є, ви можете використовуватиenable -n which
для відключення вбудованої оболонкиwhich
.