Tornar o cd automaticamente ls

47

Acho que geralmente faço o seguinte:

%> cd bla/bla
%> ls

Eu gostaria que sempre que eu cdentrar em um diretório ele automaticamente faça um ls.

Eu brinquei com o meu .bashrcpor um tempo, mas não conseguia descobrir como fazer isso acontecer.

RobKohr
fonte

Respostas:

51

Você pode fazer isso com uma função:

$ cdls() { cd "$@" && ls; }

O &&meio ' cdpara um diretório e, se for bem-sucedido (por exemplo, o diretório existe), execute ls'. Usar o &&operador é melhor do que usar um ;operador de ponto e vírgula entre os dois comandos, como acontece com { cd "$@" ; ls; }. Este segundo comando será executado lsindependentemente de ter cdfuncionado ou não. Se cdfalhar, lsimprimirá o conteúdo do diretório atual, o que será confuso para o usuário. Como prática recomendada, use &&e não ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

Em geral, é uma má prática renomear um comando que já existe, especialmente para um comando comumente chamado como cd. Em vez disso, crie um novo comando com um nome diferente. Se você sobrescrever cduma função ou apelido também nomeado cd, o que aconteceria quando você inserisse um diretório com 100.000 arquivos? Existem muitos utilitários que usam cde podem ficar confusos com esse comportamento incomum. Se você usar uma conta compartilhada (como rootquando estiver trabalhando com outros administradores de sistema), pode ser muito perigoso substituir um comando existente porque o ambiente é diferente do que as pessoas esperam.

Stefan Lasiewski
fonte
Esse comando realmente muda de diretório? A partir da página homem do bash: "Não há nenhum mecanismo para a utilização de argumentos no texto de substituição Se forem necessários argumentos, uma função shell deve ser usado."
enzotib
@enzotib: Sim, isso realmente muda de diretório, pelo menos para mim. Eu atualizei minha resposta para mostrar a saída de pwd. Não tenho certeza se essa é uma prática recomendada, mas geralmente é feita. Veja tldp.org/LDP/abs/html/aliases.html para alguns exemplos.
Stefan Lasiewski 9/09/11
2
Primeiro: não funciona aqui. Segundo: nessa página eles usam variáveis, não parâmetros posicionais. Terceiro: o ABS é uma fonte comum de más práticas.
enzotib 9/09/11
1
O alias funciona para mim no Snow Leopard, mas não no CentOS5 ou CentOS6. Atualizei minha resposta para usar apenas uma função. Sem aliases.
Stefan Lasiewski
1
Nao funciona para mim. Tentei a resposta @frabjous e funciona: cd() { builtin cd "$@" && pwd; };- usando o shell bourne padrão no macOS (Sierra 10.12.6)
Swivel
39

Eu tenho isso no meu .bashrc, e funciona bem.

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

Anteriormente, no meu .bashrc, tenho:, [ -z "$PS1" ] && returne tudo o que se segue a essa linha se aplica apenas a sessões interativas, portanto, isso não afeta o cdcomportamento dos scripts.

frabjous
fonte
1
O que exatamente faz [ -z "$PS1" ] && return?
Syntagma
2
[ -z "$PS1" ]verifica se a $PS(variável de prompt interativo) é "comprimento zero" (-z). Se o comprimento for zero, significa que não foi definido; portanto, o Bash não deve estar em execução no modo interativo. A && returnpeça sai do fornecimento .bashrcneste momento, nessas condições.
precisa saber é
1
Outra forma de verificar a interatividade é procurar iem "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda
@Kusalananda & frabjous: Existem casos em que um deve ser usado em vez do outro?
Swivel
1
@Swivel A PS1variável pode estar desconfigurada ou vazia e o shell ainda pode ser interativo (mas sem aviso). Eu verificaria $-para ter certeza.
Kusalananda
13

off-topic, uma vez que a pergunta está marcada / bash, mas como algumas perguntas são fechadas como duplicadas desta que não menciona o bash:

Com zsh:

chpwd() ls

A função chpwd () é chamada pelo zsh sempre que o diretório atual é alterado (por meio de cd, pushd, popd ...). O tcsh possui um recurso semelhante e provavelmente é de onde o zsh o obteve.

Stéphane Chazelas
fonte
4

Por que não adicionar um alias ao seu arquivo .bashrc?

Algo como:

alias cdls='cd "$@" && ls'
Kenneth Aar
fonte
@don_crissti Uma função e um apelido são coisas diferentes. Então por que não?
Jodka Lemon
Essa é a maneira mais rápida e limpa de fazer o que o OP solicitou. Na minha opinião, as funções devem ser usadas para coisas mais complicadas, ao passo que criar atalhos para comandos geralmente digitados é exatamente o que existe para os aliases.
Ghos3t 22/02
1
Estou tendo um problema estranho com esse alias; quando eu o uso dessa maneira, cdls projec2, ele mostra todos os arquivos na pasta do projeto 2, mas na verdade não o cd dessa pasta; em vez disso, ele permanece na pasta original.
Ghos3t 28/02
Sim, o uso de um alias simplesmente lista o conteúdo desse diretório, mas na verdade não é o CD para lá.
a3y3
2

A solução comum de criar um alias para o comando cd não é perfeita, porque existem outros comandos que podem alterar seu diretório atual, como popd, ou mesmo executar um script com o comando cd.

É melhor usar o gancho Bash $ PROMPT_COMMAND que executa um comando antes de retornar um prompt.

O comando (uma função no nosso caso) executará ls apenas se o diretório tiver sido alterado para reduzir o ruído da tela. Código para .bashrc:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd
Jack
fonte
2

Copie isto:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Agora você pode fazer um cd simples:

cd / 
(files listed)
cd /home 
(files listed)
etc... 
Luciano Andress Martini
fonte
1

No bash, você não pode recorrer a aliases para ações que requerem parâmetro. Para isso, existem funções. Então coloque no seu ~/.bashrco seguinte

mycd() {
  cd "$1"
  ls
}
enzotib
fonte
4
cd "$1" && lsseria melhor.
Gilles 'SO- stop be evil'
Para permitir um parâmetro para o comando ls, eu uso a função mycd {cd embutido $ 1 && ls $ 2}. Agora você pode chamar o comando, por exemplo, mycd .. -la
Christian Schulzendorff 19/02/16
@ChristianSchulzendorff: melhor usar as aspas: function mycd { builtin cd "$1" && ls "$2" } .
enzotib
Não funciona, eu apenas tentei. O arquivo estava vazio, mas depois de adicionar seu código, nada mudou.
Preto
0

Coloque o código abaixo no .profile e ele funciona. Testado na caixa HP-Unix.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"
user196161
fonte
0

Ainda mais útil - com capacidade de voltar à história :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

Quando você altera o diretório, uma linha com: Stack: (current_dir) (previous_dir) ...será mostrada e depois a lssaída. Para voltar no dirs história apenas pop este comando: popd.

Eu adicionei elsepara que você veja um erro ao tentar ir para um diretório errado.

Ctrl-C
fonte
se você apenas fazer cd - ele vai trazê-lo para sua última dir que você estava em.
Ian
0

Eu acho que é bom habilitar lsas opções dessa maneira, pois cdnão tem opção.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
iBug
fonte
Umm ... cdaceita opções.
Kusalananda
0

Aqui está o que eu acho útil (no Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Isso me dá uma saída truncada com reticências, caso haja muitos itens nesse diretório, para que o console permaneça limpo:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977
Superlexx
fonte
-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'
joek
fonte
Isso não adiciona nada que as outras respostas ainda não tenham coberto.
jasonwryan