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

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

  • Можно ли добавить функцию внутри функции?
  • Отобразить тело функции в Bash
  • Работает ли функция escaping?
  • применить функцию bash к родительскому охвату
  • Как напечатать код функции оболочки в терминале?
  • Эквивалент Bash FUNCNAME в тире
  • Развернуть переменную bash в команде pipeed
  • Выполнение функции скрипта Bash с помощью Sudo
  • 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.

    Interesting Posts

    Измерение пропускной способности скрипта Python

    Как заставить звук работать на Mozilla Firefox 52?

    Обнаружение метаданных о PDF-файле

    Какой дистрибутив Linux вы бы порекомендовали для большого универсального LiveUSB?

    Как создать функцию, которая может сортировать массив в bash?

    Bash – назначить массив переменной как строку

    Ноутбук дает бесконечный ввод клавиатуры для любого дистрибутива Linux

    Разархивировать определенные файлы из нескольких ZIP-файлов

    Может перемещаться, но не может удалить пустой / домашний каталог (root, no attr, RW файловая система, а не точка подключения, а не занята)

    Как определить интерфейс RUNNING без ifconfig?

    выполнять команду по движению указателя, ждать и возвращаться?

    Терминаторные панели автоматически подключаются к различным серверам

    sed one-liner, чтобы удалить все между двумя скобками?

    Изменение оболочки в / bin / bash без доступа root через файл

    Сравните два файла и сопоставленную строку для отправки в новый файл

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