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.
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?
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.
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;}