Substitui 'cd' ou outras funções embutidas mais de uma vez

0

Digamos que eu tenha essa função bash:

cd(){
 builtin cd "$@"
 echo "do my own thing"
}

o problema é que, se eu substituir cd em outro lugar, apenas 1 substituição contará, qualquer outra substituição será sobrescrita pela última função de origem!

Existe uma maneira de ter várias funções cd e todas serem chamadas?

Estou pensando em algo assim:

alias prev_cd="cd";

cd(){
   prev_cd  
   echo "do my own thing"
}

mas duvido que esteja certo. o problema com a solução prev_cd é que isso resultará em um loop infinito. Onde prev_cd chama minha função de cd e vice-versa. Eu só quero que o prev_cd seja definido como definições de cd fora deste arquivo.

Um truque que posso usar é encontrar o arquivo em que a função cd está localizada:

shopt -s extdebug
declare -F cd
shopt -u extdebug

se eu já tiver sobrescrito o comando cd , posso chamar unset -f cd ?

Parece que o RVM (Ruby Version Manager) substitui cd :

cd 14 /Users/alexamil/.rvm/scripts/cd

então eu não quero estragar as substituições anteriores de cd .. então eu só quero substituir cd se eu não estragar as substituições anteriores ...

    
por Alexander Mills 02.05.2018 / 06:02

2 respostas

2

Você pode copiar o corpo da definição cd em uma nova função com o nome prev_cd . Use declare -f cd para obter essa definição e, em seguida, eval para redefinir isso.

definition_prev_cd="prev_$(declare -f cd)"
eval "${definition_prev_cd}"
unset definition_prev_cd  # clean up, no reason to leave this string around

cd () {
   prev_cd "$@"
   echo "do my own thing"
}

Você pode adicionar algumas verificações ou criar uma função genérica para copiar funções arbitrárias, mas isso deve ser suficiente para que você resolva o problema descrito ...

    
por 02.05.2018 / 07:21
0

Não, vários nomes cd não podem ser executados.

Sim, pode haver várias "coisas" chamadas cd , como:

$ cd(){ echo function cd; }
$ alias cd='cd -eP'

E ainda assim, o cd embutido é definido. Em tais condições, isso acontece:

$ type -a cd
cd is aliased to 'cd -eP'
cd is a function
cd ()
{
    echo function cd
}
cd is a shell builtin

Como você vê, várias "coisas" são chamadas de cd, sim, mas somente uma delas será executada. A lista acima acontece na ordem de pesquisa, ou seja, a primeira definição de cd found é aquela que foi executada. Bem, não exatamente, um alias substituirá a palavra cd pela definição de alias cd -eP e, por sua vez, chamará novamente cd , que (seguindo a ordem da lista) chamará a função cd.

Então, não, na verdade, você não pode ter vários cd e esperar que todos eles sejam executados.

    
por 02.05.2018 / 07:40