Как переопределить функцию bash с точки зрения старого определения?

Есть ли способ переопределить функцию bash с точки зрения ее старого определения? Например, я хотел бы добавить следующий блок кода в преамбулу функции command_not_found_handle () ,

 # Check if $1 is instead a bash variable and print value if it is local VAL=$(eval echo \"\$$1\") if [ -n "$VAL" ] && [ $# -eq 1 ]; then echo "$1=$VAL" return $? fi 

В настоящее время он определен в файле /etc/profile.d/PackageKit.sh и создан сценариями запуска bash.

Таким образом, я могу запросить значение переменной среды в командной строке, просто набрав имя переменной (и при условии, что такая команда не существует). например

 user@hostname ~:$ LANG LANG=en_AU.utf8 

Я знаю, что могу просто скопировать и вставить текущее определение и добавить свои собственные изменения в ~/.bashrc , но я ищу более элегантный способ использования повторного использования кода.

Также приветствуются лучшие способы достижения моей цели или улучшения / расширения кода.

  • Что делает «while test $ # -gt 0»?
  • Можете ли вы запустить функцию в фоновом режиме?
  • Функция в функции не будет вызвана несколько раз, если потребуется?
  • Префикс каждого аргумента с -o в BASH
  • Выполнение функции скрипта Bash с помощью Sudo
  • Использование «@» в качестве имени функции bash
  • Использование времени для функций bash (не команд)
  • тире: список объявленных функций
  • 2 Solutions collect form web for “Как переопределить функцию bash с точки зрения старого определения?”

    Вы можете распечатать текущее определение функции, а затем включить ее в определение функции внутри предложения eval .

     current_definition=$(declare -f command_not_found_handle) current_definition=${current_definition#*\{} current_definition=${current_definition%\}} prefix_to_add=$(cat <<'EOF' # insert code here (no special quoting required) EOF ) suffix_to_add=$(cat <<'EOF' # insert code here (no special quoting required) EOF ) eval "command_not_found_handle () { $prefix_to_add $current_definition $suffix_to_add }" 

    Другим подходом, который я нахожу более ясным, является определение исходной функции под новым именем и вызов этого из вашего определения. Это работает только в том случае, если вам не нужно воздействовать на локальные переменные исходного определения.

     eval "original_$(declare -f command_not_found_handle)" command_not_found_handle () { … original_command_not_found_handle … } 

    Спасибо @mat, @ dennis-williamson. После прочтения ваших комментариев, это то, что я получил

     eval 'command_not_found_handle () { local VAL=$(echo "${!1}") if [ -n "$VAL" ] && [ $# -eq 1 ]; then echo "$1=$VAL" return $? fi '$(declare -f command_not_found_handle | tail -n +3 | head -n -1)' }' 

    Хотя я думаю, что предпочитаю решение @Gilles.

    Linux и Unix - лучшая ОС в мире.