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

Нет, они подобны, но между двумя нет никаких зависимостей. Таким образом, можно изучить Солярис, ничего не зная о Linux.

С другой стороны, я не думаю, что это - плохая вещь знать немного о том, как различные версии Unix ведут себя....

13
23.01.2012, 07:21
2 ответа

Можно распечатать текущее определение функции и затем включать его в функциональное определение в 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
  …
}
14
27.01.2020, 19:53
  • 1
    С наилучшими пожеланиями, мне никогда не приходило в голову использовать здесь-документы, никакое специальное требуемое заключение в кавычки. Я думаю, что предпочитаю Ваш первый метод, помогает просмотреть целое определение с declare -f, но мне нравится способ, которым Вы переименовываете исходный func. –  tmoschou 23.01.2012, 08:16

Спасибо @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 решение.

0
27.01.2020, 19:53

Теги

Похожие вопросы