Eu quero personalizar a funcionalidade de cd
comando conforme minhas necessidades.
Eu defini a seguinte função -
function cd () { cd "$@" && pushd "$@"; }
O objetivo desta função é enviar automaticamente o diretório para a pilha, para que me poupe o esforço de digitar manualmente pushd .
todas as vezes.
No entanto, a função acima é uma função infinitamente recursiva, pois a chamada para cd
é interpretada como sendo a própria função e não acd
incorporada.
Como faço para referenciar o cd
built-in nesta função?
Eu sei que aliases podem ser escapados usando \
. Qual é a maneira de escapar de funções ou fazer referência a built-ins de maneira mais explícita?
Nota: Não quero renomear minha função para mais nada.
bash
shell-script
shell-builtin
Kshitiz Sharma
fonte
fonte
alias cd=pushd
? O que você espera que aconteça quando você acessa algo que não é um caminho absoluto (por exemplo,cd ../
)?pushd
não suporta-P
. Mas você está certo, como mostra a pergunta,function cd
parece um pouco errado, pois mudou de diretório duas vezes.Respostas:
O
command
builtin força um nome de comando a ser interpretado como um comando interno ou externo (ignorando alias e pesquisa de função). Está disponível em todos os shells POSIX, incluindo o bash.(Observe que este exemplo é ruim: ele não funciona com caminhos relativos e você pode apenas digitar
pushd
em primeiro lugar.)No bash e no zsh (mas não no ksh), você pode
builtin
forçar um nome de comando a ser interpretado como interno, excluindo aliases, funções e comandos externos.fonte
O Bash possui um comando (interno)
builtin
, que faz exatamente o que você precisa. Substituircd
porbuiltin cd
na sua função corrigirá a recursão.fonte
Eu suspeito que quando você diz que "não deseja renomear sua função para outra coisa", quer dizer que deseja chamar sua função pelo mesmo nome que o comando original.
Portanto, outra maneira de fazer isso que também funciona para coisas que não são integradas é nomear sua função de outra maneira e definir um alias para o comando agrupado. Isso funciona porque o alias não existe no contexto de execução da sua função.
Exemplo wrapper.sh:
E em, por exemplo, .bash_aliases:
Mas isso é bastante hacky.
command
É preferível usar quando possível.fonte
Para que isso funcione com caminhos relativos, seria necessário o seguinte:
Isso pressupõe que você esteja em uma distribuição Linux moderna o suficiente que contenha o utilitário 'realpath'. (RHEL 6 não, por exemplo). Se o Perl estiver disponível, 'realpath' pode ser simulado usando:
fonte