Что мне следует знать при определении функции bash для использования имени программы?

Что мне следует знать при определении функции bash для использования имени программы?

Во многих случаях мне нужно создавать функции с такими же именами, как у других программ, и я понятия не имею, является ли это хорошим способом использования bash-скриптов.

Пример:

    function echo () {
        echo -n "$@" ;
    }  

После тестирования похоже, что он проверяет имена функций внутри скрипта перед путями bin. Я хочу убедиться в этом и любой другой информации, которую мне следует знать.

решение1

echo() {
  command echo -n "$@"
}

Использование commandздесь означает запрос echoкоманды (которая здесь встроена) вместо функции, которая в противном случае имела бы приоритет.

И поскольку здесь echoтакже есть встроенная команда (кстати, она не ищется в $PATHTW, так как встроенные команды имеют приоритет над командами файловой системы), вы также можете сделать:

echo() {
  builtin echo -n "$@"
}

Последний подход предпочтительнее в zsh, где вместо этого command echoбудет работать /bin/echo(за исключением shэмуляции).

Между оболочками есть некоторые незначительные различия, но в целом порядок приоритета следующий:

  1. специальные встроенные функции
  2. функции
  3. встроенные функции
  4. команды в $PATH(и порядок зависит от порядка в $PATHи в hashтаблице, как управляется hashвстроенной функцией)

Имейте в виду, что псевдонимы и ключевые слова в синтаксисе оболочки ( for, if...), если они не заключены в кавычки, рассматриваются перед ними.

В некоторых оболочках, например или , порядок 1и 2обратен . не позволяет определять функции с тем же именем, что и у специальной встроенной функции, при вызове как .bashzshbashsh

Связанный контент