Как переопределить функцию 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 , но я ищу более элегантный способ использования повторного использования кода.

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

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.

  • найти псевдоним с поиском
  • Как VARIABLE = () {определение функции} работает в bash
  • Как выполнить 'find' с 'sed' в функции bash
  • Восстановление опции в конце функции в zsh
  • Что произойдет, если я передам слишком мало параметров функции оболочки?
  • Запуск исполняемого файла в PATH с тем же именем, что и существующая функция
  • Как вы перечисляете все функции и псевдонимы в определенном скрипте?
  • Есть что-то вроде закрытия для zsh?
  • создание простой команды для sudo apt-get install?
  • Проверка, является ли команда встроенной в ksh
  • Что происходит в этой функции?
  • что такое zsh-эквивалент экспорта bash -f
  • Interesting Posts

    Шаблоны файлов Deb-пакета

    Ubuntu, установленный из mini-ISO под VirtualBox, не загружается

    Не обнаружено устройство Ethernet

    Oneliner для определения переменных верблюда

    Map Caps Lock для управления в Linux Mint

    Как узнать коды клавиш для клавиш Ctrl + вверх и вниз для экрана TERM =?

    «Не удалось найти подходящее устройство stage1» при установке Grub вдоль Windows

    Как подключить veth-устройство внутри «анонимного» пространства имен в сети к внешнему?

    Я хочу отправить черный список в amavisd-new из домена, где адреса отправителя закодированы в utf8

    Создание псевдонима для изменения каталога и наличие этого каталога в текущем рабочем каталоге на вкладках новых терминалов

    Доля устройства захвата alsa с alsaloop

    «Неверная версия libnet» при настройке заклинания «Немезида»

    Указание шрифтов в xterm

    Клавиши курсора не перескакивают через вкладки в Vim

    Перенаправить файловый дескриптор перед выполнением

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