Як переосмислити функцію bash з точки зору старого визначення?


13

Чи є спосіб переосмислити функцію 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, але я шукаю більш елегантний спосіб, який передбачає повторне використання коду.

Також вдячні кращі способи досягнення моєї цілі або покращення / розширення коду.


Якщо це питання краще підійде для стаціонарного потоку, чи може хтось перенести його, я не знаю як.
tmoschou

3
Я думаю, що ця публікація в Stack Overflow відповідає на ваше запитання.
Мат

2
Замість цього evalви можете використовувати непряме:local VAL=$(echo ${!1})
Призупинено до подальшого повідомлення.

Відповіді:


14

Ви можете роздрукувати поточне визначення функції, а потім включити його у визначення функції всередині 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
  
}

1
Будьте здорові, мені ніколи не траплялося використовувати тут документи, не вимагаючи спеціального цитування. Я думаю, що я віддаю перевагу вашому першому методу, полегшує перегляд всього визначення за допомогою declare -f, але мені подобається спосіб перейменування оригінального функціоналу.
tmoschou

0

Дякую @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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.