Есть ли способ, которым я могу переопределить функцию 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
, но я ищу более элегантный способ, который включает повторное использование кода.
Также приветствуются лучшие способы достижения моей цели или улучшения / расширения кода.
eval
вы можете использовать косвенноеlocal VAL=$(echo ${!1})
Ответы:
Вы можете распечатать текущее определение функции, а затем включить его в определение функции внутри
eval
предложения.Другой подход, который я считаю более понятным, заключается в том, чтобы определить исходную функцию под новым именем и вызвать ее из своего определения. Это работает, только если вам не нужно воздействовать на локальные переменные исходного определения.
источник
declare -f
, но мне нравится, как вы переименовываете оригинальную функцию.Спасибо @mat, @ dennis-williamson. Прочитав ваши комментарии, вот что я получил
Хотя я думаю, что предпочитаю решение @Gilles.
источник