Como invocar um shell embutido explicitamente?

12

Eu quero personalizar a funcionalidade do comando cd conforme minhas necessidades.

Eu defini a seguinte função - function cd () { cd "$@" && pushd "$@"; }

A intenção desta função é empurrar automaticamente o diretório para a pilha, de modo que ele me poupe o esforço para digitar manualmente pushd . todas as vezes.

No entanto, a função acima é uma função infinitamente recursiva, já que a chamada para cd é interpretada como a própria função e não o cd embutido.

Como faço referência ao cd embutido nessa função?

Eu sei que os aliases podem ser escapados usando \ . Qual é a maneira de escapar de funções ou referências internas de uma maneira mais explícita?

Observação: não quero renomear minha função para qualquer outra coisa.

    
por Kshitiz Sharma 27.11.2013 / 13:05

3 respostas

4

O command embutido força um nome de comando a ser interpretado como um arquivo interno ou comando externo (ignorando alias e pesquisa de função). Está disponível em todas as shells do POSIX, incluindo o bash.

cd () { command cd "$@" && pushd "$@"; }

(Observe que este exemplo é ruim: ele não funciona com caminhos relativos e você pode simplesmente digitar pushd em primeiro lugar).

No bash e zsh (mas não no ksh), você pode usar builtin para forçar um nome de comando a ser interpretado como interno, excluindo aliases, funções e comandos externos.

    
por 28.11.2013 / 01:58
14

Bash tem um comando (interno) builtin , que faz exatamente o que você precisa. Substituir cd por builtin cd em sua função corrigirá a recursão.

    
por 27.11.2013 / 13:08
1

Eu suspeito que quando você diz que "não quer renomear sua função para qualquer outra coisa", você quer dizer que você quer chamar sua função com o mesmo nome do comando original.

Assim, outra maneira de fazer isso que também funciona para coisas que não são internas, é nomear sua função como algo diferente e, em seguida, definir um alias para o comando wrapped. Isso funciona porque o alias não existe no contexto de execução da sua função.

Exemplo de wrapper.sh:

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

E em, por exemplo, .bash_aliases:

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

Mas isso é bem hacky. Usar command é preferível quando possível.

    
por 25.07.2018 / 01:23