Je trouve que je fais souvent ce qui suit:
%> cd bla/bla
%> ls
Je voudrais que chaque fois que je cd
dans un répertoire, il fasse automatiquement un ls
.
J'ai tripoté mon .bashrc
pendant un certain temps, mais je n'ai pas réussi à comprendre comment y arriver.
Vous pouvez le faire avec une fonction:
$ cdls() { cd "$@" && ls; }
Le &&
signifie 'cd
dans un répertoire, et en cas de succès (par exemple, le répertoire existe), exécutez ls
'. En utilisant le &&
il vaut mieux utiliser un point-virgule ;
opérateur entre les deux commandes, comme avec { cd "$@" ; ls; }
. Cette deuxième commande exécutera ls
, que cd
ait fonctionné ou non. Si cd
a échoué, ls
affichera le contenu de votre répertoire actuel, ce qui sera déroutant pour l'utilisateur. Comme meilleure pratique, utilisez &&
et pas ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
En général, il est déconseillé de renommer une commande qui existe déjà, en particulier pour une commande communément appelée comme cd
. Au lieu de cela, créez une nouvelle commande avec un nom différent. Si vous remplacez cd
par une fonction ou un alias également nommé cd
, que se passerait-il lorsque vous entrez dans un répertoire contenant 100 000 fichiers? Il existe de nombreux utilitaires qui utilisent cd
, et ils peuvent être déconcertés par ce comportement inhabituel. Si vous utilisez un compte partagé (tel que root
lorsque vous travaillez avec d'autres administrateurs système), il peut être très dangereux de remplacer une commande existante car l'environnement est différent de ce à quoi les gens s'attendent.
J'ai ceci dans mon .bashrc, et cela fonctionne très bien.
function cd {
builtin cd "$@" && ls -F
}
Plus tôt dans mon .bashrc, j'ai: [ -z "$PS1" ] && return
, et tout ce qui se trouve après cette ligne ne s'applique qu'aux sessions interactives, donc cela n'affecte pas le comportement de cd
dans les scripts.
hors sujet, puisque la question est taguée/bash, mais comme certaines questions sont fermées en double de celle-ci qui ne mentionne pas bash:
Avec zsh:
chpwd() ls
La fonction chpwd () est appelée par zsh chaque fois que le répertoire courant change (via cd, pushd, popd ...). tcsh a une fonctionnalité similaire et est probablement d'où zsh l'a obtenu.
Pourquoi ne pas ajouter un alias à votre fichier .bashrc?
Quelque chose comme:
alias cdls='cd "$@" && ls'
Copiez ceci:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Maintenant, vous pouvez simplement faire un cd simple:
cd /
(files listed)
cd /home
(files listed)
etc...
La solution courante de création d'alias pour la commande cd n'est pas parfaite car il existe d'autres commandes qui peuvent changer votre répertoire actuel comme popd ou même exécuter un script avec la commande cd.
Il est préférable d'utiliser le hook $ Prompt_COMMAND Bash qui exécute une commande avant de renvoyer une invite.
La commande (une fonction dans notre cas) n'exécutera ls que si le répertoire a changé pour réduire le bruit à l'écran. Code pour .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
Dans bash, vous ne pouvez pas revenir aux alias pour les actions qui nécessitent un paramètre. Pour cela, il existe des fonctions. Alors mettez votre ~/.bashrc
le suivant
mycd() {
cd "$1"
ls
}
Placez le code ci-dessous dans le .profile et cela fonctionne. Testé sur la boîte 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"
Je pense qu'il est bon d'activer les options de ls
de cette manière car cd
ne prend aucune option.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
Encore plus pratique - avec la possibilité de remonter dans l'histoire:
function cd() {
if [ -d "$@" ]; then
echo -n "Stack: "
pushd "$@"
ls
else
builtin cd "$@"
fi
}
function popd() {
builtin popd "$@" && ls
}
Lorsque vous changez de répertoire, une ligne avec: Stack: (current_dir) (previous_dir) ...
sera affichée, puis ls
sortie. Pour revenir dans l'historique des répertoires, il suffit de faire apparaître cette commande: popd
.
J'ai ajouté else
afin que vous voyiez une erreur lorsque vous essayez d'accéder à un mauvais répertoire.
Voici ce que je trouve utile (sur 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
'
}
Cela me donne une sortie tronquée avec des points de suspension au cas où il y aurait trop d'éléments dans ce répertoire pour que la console reste propre:
$ 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