Во многих случаях мне нужно создавать функции с такими же именами, как у других программ, и я понятия не имею, является ли это хорошим способом использования bash-скриптов.
Пример:
function echo () {
echo -n "$@" ;
}
После тестирования похоже, что он проверяет имена функций внутри скрипта перед путями bin. Я хочу убедиться в этом и любой другой информации, которую мне следует знать.
решение1
echo() {
command echo -n "$@"
}
Использование command
здесь означает запрос echo
команды (которая здесь встроена) вместо функции, которая в противном случае имела бы приоритет.
И поскольку здесь echo
также есть встроенная команда (кстати, она не ищется в $PATH
TW, так как встроенные команды имеют приоритет над командами файловой системы), вы также можете сделать:
echo() {
builtin echo -n "$@"
}
Последний подход предпочтительнее в zsh
, где вместо этого command echo
будет работать /bin/echo
(за исключением sh
эмуляции).
Между оболочками есть некоторые незначительные различия, но в целом порядок приоритета следующий:
- специальные встроенные функции
- функции
- встроенные функции
- команды в
$PATH
(и порядок зависит от порядка в$PATH
и вhash
таблице, как управляетсяhash
встроенной функцией)
Имейте в виду, что псевдонимы и ключевые слова в синтаксисе оболочки ( for
, if
...), если они не заключены в кавычки, рассматриваются перед ними.
В некоторых оболочках, например или , порядок 1
и 2
обратен . не позволяет определять функции с тем же именем, что и у специальной встроенной функции, при вызове как .bash
zsh
bash
sh