Risposte:
Puoi farlo con una funzione:
$ cdls() { cd "$@" && ls; }
I &&
mezzi ' cd
in una directory, e se (ad esempio, esiste la directory) di successo, run ls
'. Usare l' &&
operatore è meglio quindi usare un ;
operatore punto e virgola tra i due comandi, come con { cd "$@" ; ls; }
. Questo secondo comando verrà eseguito ls
indipendentemente dal fatto che abbia cd
funzionato o meno. In caso cd
contrario, ls
stamperà il contenuto della directory corrente, che sarà fonte di confusione per l'utente. Come best practice, usa &&
e non ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
In generale, è una cattiva pratica rinominare un comando che esiste già, specialmente per un comando comunemente chiamato come cd
. Invece, crea un nuovo comando con un nome diverso. Se si sovrascrive cd
con una funzione o un alias che è anche chiamato cd
, cosa accadrebbe quando si accede a una directory con 100.000 file? Ci sono molte utility che usano cd
e possono essere confuse da questo comportamento insolito. Se si utilizza un account condiviso (come root
quando si lavora con altri amministratori di sistema), può essere molto pericoloso sostituire un comando esistente perché l'ambiente è diverso da quello che le persone si aspettano.
pwd
. Non sono sicuro se questa è una buona pratica, ma è comunemente fatta. Vedi tldp.org/LDP/abs/html/aliases.html per alcuni esempi.
cd() { builtin cd "$@" && pwd; };
- usando la shell bourne standard su macOS (Sierra 10.12.6)
Ho questo nel mio .bashrc e funziona benissimo.
function cd {
builtin cd "$@" && ls -F
}
In precedenza nel mio .bashrc ho:, [ -z "$PS1" ] && return
e tutto ciò che segue quella riga si applica solo alle sessioni interattive, quindi questo non influisce sul cd
comportamento degli script.
[ -z "$PS1" ] && return
?
[ -z "$PS1" ]
controlla se la $PS
(variabile prompt interattiva) è "lunghezza zero" (-z). Se ha una lunghezza pari a zero, significa che non è stato impostato, quindi Bash non deve essere in esecuzione in modalità interattiva. La && return
parte esce dall'approvvigionamento .bashrc
a questo punto, in queste condizioni.
i
in "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
variabile potrebbe essere non impostata o vuota e la shell potrebbe essere comunque interattiva (ma senza un prompt). Vorrei verificare $-
per essere sicuro.
off-topic, poiché la domanda è taggata / bash, ma poiché alcune domande sono chiuse come duplicate di questa che non menziona bash:
Con zsh:
chpwd() ls
La funzione chpwd () viene chiamata da zsh ogni volta che cambia la directory corrente (tramite cd, pushd, popd ...). tcsh ha una funzione simile ed è probabilmente da dove zsh l'ha preso.
Perché non aggiungere un alias al tuo file .bashrc?
Qualcosa di simile a:
alias cdls='cd "$@" && ls'
La soluzione comune di creare un alias per il comando cd non è perfetta perché ci sono altri comandi che possono cambiare la directory corrente come popd o persino eseguire uno script con il comando cd al suo interno.
È meglio utilizzare $ PROMPT_COMMAND Bash hook che esegue un comando prima di restituire un prompt.
Il comando (una funzione nel nostro caso) eseguirà ls solo se la directory è cambiata per ridurre il rumore dello schermo. Codice per .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
Copia questo:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Ora puoi semplicemente fare un semplice cd:
cd /
(files listed)
cd /home
(files listed)
etc...
In bash non è possibile ricorrere ad alias per azioni che richiedono parametri. Per questo ci sono funzioni. Quindi inserisci ~/.bashrc
il seguente
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Inserisci il codice qui sotto nel .profile e funziona. Testato su scatola 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"
Ancora più utile - con la possibilità di tornare indietro nella storia :
function cd() {
if [ -d "$@" ]; then
echo -n "Stack: "
pushd "$@"
ls
else
builtin cd "$@"
fi
}
function popd() {
builtin popd "$@" && ls
}
Quando si cambia directory Stack: (current_dir) (previous_dir) ...
verrà visualizzata una riga con :, quindi ls
output. Per tornare in dirs storia basta inserire questo comando: popd
.
Ho aggiunto else
quindi vedrai un errore quando provi ad andare in una directory sbagliata.
Penso che sia bene abilitare ls
le opzioni in questo modo in quanto cd
non richiede opzioni.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
prende opzioni.
Ecco cosa trovo utile (su 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
'
}
Questo mi dà l'output troncato con i puntini di sospensione nel caso in cui ci siano troppi elementi in quella directory in modo che la console rimanga pulita:
$ 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'