Мені потрібно знайти шлях заданої програми на 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.