Иногда я определяю функцию, которая скрывает исполняемый файл и настраивает его аргументы или вывод. Поэтому имя функции совпадает с именем исполняемого файла, и мне нужен способ запуска исполняемого файла из функции без рекурсивного вызова функции. Например, для автоматического запуска вывода fossil diff
через colordiff
и less -R
я использую:
function fossil () {
local EX=$(which fossil)
if [ -z "$EX" ] ; then
echo "Unable to find 'fossil' executable." >&2
return 1
fi
if [ -t 1 ] && [ "$1" == "diff" ] ; then
"$EX" "$@" | colordiff | less -R
return
fi
"$EX" "$@"
}
Если бы я был уверен в расположении исполняемого файла, я мог бы просто напечатать /usr/bin/fossil
. Bash признает, что это /
означает, что команда - это исполняемый файл, а не функция. Но так как я не знаю точного местоположения, я должен прибегнуть к звонку which
и проверке результата. Есть ли более простой способ?
/
означает, что команда является исполняемым файлом, а не функцией». Строго говоря, это не так. В то, что я считаю ужасным (и недокументированным) дизайнерским решением, bash позволяет именам функций содержать косую черту. Косая черта просто приводит/usr/bin/fossil
к тому, что она отличается от строкиfossil
, поэтому, когда вы говорите/usr/bin/fossil
, она не пытается запуститьfossil
функцию.Ответы:
Используйте
command
встроенную оболочку:источник
\date
.В сценариях
#!
строка часто используется/bin/env bash
для запуска команды bash на основе пути. (Это может отличаться для некоторых утилит). Это должно работать и здесь ...(
command
Альтернатива также должна работать, но может зависеть от конкретной оболочки) (она работает на Bourne Shell в Solaris, но на самом деле она работает/bin/command
в этом случае, который является встроенной в Bash оболочкой)И то,
/bin/command
и другое/bin/env
указано в SUS, поэтому все совместимые реализации должны иметь его.источник
env
. Я сомневался, какой ответ мне следует принять, но поскольку вопрос касается bash , его встроенноеcommand
решение является лучшим решением.command
исполняемого файла, ноcommand
также работает вdash
,ksh
иzsh
. Поэтому я предполагаю, что это встроенная оболочка не только вbash
. pastebin.com/fi3gyNse/bin/env
после хэш-удара, если они не хотят жестко кодировать путь оболочки)Ответ Герта заставил меня понять, что можно использовать и
nice
для этой цели (на самом деле это было в одном из моих сценариев, не осознавая этого):Это менее элегантно, чем другие ответы, но в некоторых случаях это может быть полезным вариантом.
источник
`which date`
.`which something`
том, что если нетsomething
исполняемого файла, могут произойти неприятные вещи. Например, еслиecho
отсутствует, то`which echo` /bin/rm preciousFile
делает что-то совсем другое, чем предполагалось.