Respostas:
Você pode fazer isso com uma função:
$ cdls() { cd "$@" && ls; }
O &&
meio ' cd
para 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 ls
independentemente de ter cd
funcionado ou não. Se cd
falhar, ls
imprimirá 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 cd
uma 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 cd
e podem ficar confusos com esse comportamento incomum. Se você usar uma conta compartilhada (como root
quando estiver trabalhando com outros administradores de sistema), pode ser muito perigoso substituir um comando existente porque o ambiente é diferente do que as pessoas esperam.
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.
cd() { builtin cd "$@" && pwd; };
- usando o shell bourne padrão no macOS (Sierra 10.12.6)
Eu tenho isso no meu .bashrc, e funciona bem.
function cd {
builtin cd "$@" && ls -F
}
Anteriormente, no meu .bashrc, tenho:, [ -z "$PS1" ] && return
e tudo o que se segue a essa linha se aplica apenas a sessões interativas, portanto, isso não afeta o cd
comportamento dos scripts.
[ -z "$PS1" ] && return
?
[ -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 && return
peça sai do fornecimento .bashrc
neste momento, nessas condições.
i
em "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
variável pode estar desconfigurada ou vazia e o shell ainda pode ser interativo (mas sem aviso). Eu verificaria $-
para ter certeza.
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.
Por que não adicionar um alias ao seu arquivo .bashrc?
Algo como:
alias cdls='cd "$@" && ls'
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
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...
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 ~/.bashrc
o seguinte
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
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"
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 ls
saída. Para voltar no dirs história apenas pop este comando: popd
.
Eu adicionei else
para que você veja um erro ao tentar ir para um diretório errado.
Eu acho que é bom habilitar ls
as opções dessa maneira, pois cd
não tem opção.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
aceita opções.
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
alias cd='builtin cd $1 && ls -l && builtin cd $1'