Sempre que eu 'cd' em um diretório diferente na minha máquina (nesse caso, executando o Mac OS X 10.6.7) pela linha de comando (que é o bash), eu imediatamente digito 'ls' para obter a lista de conteúdos nesse diretório. Estou tentando descobrir uma maneira de substituir o 'cd' para que ele mude para o diretório solicitado e depois me dê a lista de uma só vez.
Consegui obter a funcionalidade básica que estou procurando trabalhar com a seguinte linha adicionada ao meu ~ / .bash_profile
function cl() { cd "$@"; ls -l; }
Isso funciona conforme o esperado. Mudando para o diretório solicitado e depois me mostrando o conteúdo. Onde encontro um problema é tentar substituir o próprio "cd" em vez de criar um novo comando "cl".
O seguinte não funciona
##### 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;
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' em funcionamento. Nenhum dos quais funcionou.
O que 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 o modo como a função precisaria usá-lo).
Portanto, atualmente posso usar meu comando "cl" e obter o que quero, mas a questão é / permanece:
Existe uma maneira de substituir o comportamento do 'cd' para que ele mude para o diretório solicitado e faça outra coisa depois?
fonte
cd ""
(o que esta resposta deve avaliar é diferentecd "$@"
com vazio$@
Desculpe a confusão..Eu acho que você está correndo em um loop. Sua
cd
função está chamandocd
, que é ... a função.Você precisa saber sobre
builtin
qual é uma palavra-chave que faz com que a pesquisa de comando use os recursos internos do Bash, como cd, e não sua funçãoAlém disso, a chamada
/usr/bin/cd
nunca funcionará, mesmo que esse comando existisse.O que aconteceria:
/bash/dir
./usr/bin/cd /dir/for/cd
./usr/bin/cd
vai para dir/dir/for/cd
./usr/bin/cd
saídas./bash/dir
, porque o processo filho/usr/bin/cd
não pode afetar o pai.Os aliases também são simples substituições de texto. Eles nunca podem ter parâmetros.
fonte
builtin cd $@ && ls
; uma vez que acd
chamada deve ter sucesso para que todo o resto faça sentido. Além disso, lembre-se de casos especiais comocd
(sem argumento).Sugiro não substituir o cd porque existem outros scripts que seqüestram a função 'cd', por exemplo, rvm. Seria melhor escolher outro nome, como 'd', e não especificar o tipo 'builtin' na sua função; caso contrário, o seqüestrador não funcionaria. Estou usando o código abaixo:
fonte