Нет, они подобны, но между двумя нет никаких зависимостей. Таким образом, можно изучить Солярис, ничего не зная о Linux.
С другой стороны, я не думаю, что это - плохая вещь знать немного о том, как различные версии Unix ведут себя....
Можно распечатать текущее определение функции и затем включать его в функциональное определение в 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 решение.
declare -f
, но мне нравится способ, которым Вы переименовываете исходный func. – tmoschou 23.01.2012, 08:16