É possível sobrescrever o comando “cd” embutido na linha de comando?

22

Quase toda vez que eu 'cd' para um diretório diferente na minha máquina (neste caso, executando o Mac OS X 10.6.7) através da linha de comando (que é bash), eu imediatamente digito 'ls' para obter o lista de conteúdos nesse diretório. Eu estou tentando descobrir uma maneira de substituir 'cd' para que ele mude para o diretório solicitado e, em seguida, me dá a lista de uma só vez.

Consegui obter a funcionalidade básica que estou procurando trabalhando com a seguinte linha adicionada ao meu ~ / .bash_profile

function cl() { cd "$@"; ls -l; }

Isso funciona como esperado. Mudando para o diretório solicitado e, em seguida, mostrando-me o conteúdo. Onde eu me deparo com um problema está tentando substituir o próprio "cd" em vez de criar um novo comando "cl".

As seguintes coisas não funcionam

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

Eu também tentei várias outras iterações que não estão listadas, além de criar um alias que aponta para a função 'cl' funcional. Nenhum dos quais funcionou.

O que eu li na documentação fala sobre o fato de que 'cd' não pode ser executado como um comando externo (que é o que eu entendo ser a maneira que a função precisaria usá-lo).

Então, atualmente posso usar meu comando "cl" e obter o que quero, mas a pergunta é / permanece:

Existe uma maneira de sobrescrever o comportamento do 'cd' para que ele mude para o diretório solicitado e depois faça outra coisa depois?

    
por Alan W. Smith 13.06.2011 / 17:51

3 respostas

30

Os seguintes itens devem funcionar:

function cd() { builtin cd "$@" && ls -l; }

Como a função está em uma única linha, certifique-se de que ela seja terminada com ; , conforme descrito acima, para funcionar corretamente.

    
por 13.06.2011 / 17:59
10

Eu acho que você está correndo em um loop. Sua função cd está chamando cd , que é ... a função Você precisa saber sobre builtin , que é uma palavra-chave que faz com que a consulta de comando use os Bash incorporados como cd e não sua função

function cd
{
    builtin cd "$1"
    : do something else
}

Além disso, chamar / usr / bin / cd nunca funcionará, mesmo se tal comando existir.

O que aconteceria:

  • Meu shell Bash está em dir / bash / dir

  • Eu executo um comando /usr/bin/cd /dir/for/cd

  • / usr / bin / cd vai para dir / dir / para / cd

  • / usr / bin / cd sai.

  • O Bash ainda está em / bash / dir, porque o processo filho / usr / bin / cd não pode afetar o pai.

Os aliases também são substituições de texto simples. Eles nunca podem ter parâmetros.

    
por 13.06.2011 / 17:57
6

Sugiro não substituir o cd porque existem alguns outros scripts sequestrando a função 'cd', por exemplo, rvm. Seria melhor escolher outro nome, como 'd', e não especificar o tipo 'builtin' em sua função; caso contrário, o seqüestrador não funcionaria. Eu estou usando o código abaixo:

function d() { cd "$@" && ls;} 
    
por 20.07.2012 / 17:22