Sempre executa um comando após outro comando

6

Com zsh (e oh-my-zsh ), é possível sempre executar um comando após um determinado outro comando? Eu quero sempre executar um ls após cd ing para um diretório, em vez de executar cd example; ls todas as vezes.

Eu tentei:

function cd {
  cd $1
  ls
}

Mas parece sair zsh quando executado, sem qualquer saída (estouro de pilha?). Mudar o nome da função faz com que funcione como deveria, no entanto eu prefiro ainda usar o comando cd .

alias cd='cd $1;ls'

Lista o diretório especificado, mas na verdade não altera o diretório de trabalho.

É possível fazer isso e, em caso afirmativo, como?

    
por JJJollyjim 30.05.2013 / 02:25

2 respostas

10

Embora você já tenha resolvido seu problema, eu quero elaborar um pouco.

Por que seu alias não funciona:

@eviloup já deu a entender, mas para afirmar claramente: Os aliases (em zsh e bash ) não são capazes de receber argumentos (enquanto em csh eles podem). Pense nisso como uma simples substituição de string. Assim, com alias cd='cd $1;ls' definido, o comando cd foo expande para cd ; ls foo porque $1 está vazio (não definido neste contexto) e você vê o conteúdo de foo/ , mas o shell usa cd no < em> diretório atual (sem argumento após cd ).

Por que sua função, como na pergunta, não funciona:

Você define uma função cd , que chama cd . Então você acaba em um loop infinito. A versão atual do zsh (5.0.2) não segfault, mas dá um erro:

cd:1: maximum nested function level reached

A solução é usar builtin cd dentro de sua função cd - como você já trabalhou sozinho.

Por que sua função (do existente ) pode ser melhorada

Você está redefinindo a função cd . Isso funciona bem, se você chamar explicitamente. Mas o zsh oferece a opção AUTO_CD (a ser definida com setopt AUTO_CD ):

If a command is issued that can't be executed as a normal command, and the command is the name of a directory, perform the cd command to that directory.

Isso significa que você pode mudar para /var simplesmente digitando /var em vez de cd /var . Nesse caso, sua função cd não é chamada e você não visualizou o conteúdo de /var automaticamente.

pushd e popd são outros casos em que um comando cd redefinido não ajuda .

O caminho ZSH

Stephane Chazelas na SE / UL já deu o caminho certo, como destacado por @eviloup in os comentários: Não redefina cd , mas use a função de gancho chpwd() , que está lá exatamente por esse motivo:

chpwd Executed whenever the current working directory is changed.

Então, basta adicionar

function chpwd() {
  ls
}

para o seu ~/.zshrc . (Uma forma abreviada disso é chpwd() ls , conforme fornecido na resposta vinculada.)

    
por 30.05.2013 / 12:30
4

Esta postagem no Unix / Linux resolveu para mim:

function cd {
  builtin cd "$@" && ls -F
}

É sobre o bash, mas funciona para mim em zsh.

    
por 30.05.2013 / 02:44