Como eu redefino uma função bash em termos de definição antiga?

13

Existe alguma maneira de redefinir uma função bash em termos de sua antiga definição? Por exemplo, eu gostaria de adicionar o seguinte bloco de código ao preâmbulo da função 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

Atualmente, ele está definido em /etc/profile.d/PackageKit.sh e é originado pelos scripts de inicialização do bash.

Dessa forma, posso consultar o valor de uma variável de ambiente no prompt de comando, simplesmente digitando o nome da variável (e desde que não exista nenhum comando com esse nome). por exemplo,

user@hostname ~:$ LANG
LANG=en_AU.utf8

Sei que posso copiar e colar a definição atual e adicionar minhas próprias alterações em ~/.bashrc , mas estou procurando uma maneira mais elegante que envolva a reutilização de código.

Melhores formas de alcançar minhas metas / melhorias / extensões de código também são bem-vindas.

    
por tmoschou 22.01.2012 / 08:04

2 respostas

13

Você pode imprimir a definição atual da função e incluí-la em uma definição de função dentro de uma cláusula 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
}"

Outra abordagem, que eu acho mais clara, é definir a função original com um novo nome e chamar isso da sua definição. Isso só funciona se você não precisa agir sobre as variáveis locais da definição original.

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
  …
  original_command_not_found_handle
  …
}
    
por 23.01.2012 / 00:58
0

Obrigado @mat, @ dennis-williamson. Depois de ler seus comentários, é isso que consegui

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)'
}'

Embora eu ache que prefiro a solução @Gilles.

    
por 23.01.2012 / 07:11

Tags