Réponses:
Vous pouvez le faire avec une fonction:
$ cdls() { cd "$@" && ls; }
Le &&
moyen " cd
vers un répertoire, et en cas de succès (par exemple, le répertoire existe), exécutez ls
". Il &&
vaut mieux utiliser l' opérateur que d'utiliser un ;
opérateur en point-virgule entre les deux commandes { cd "$@" ; ls; }
. Cette deuxième commande sera exécutée ls
indépendamment du cd
travail effectué ou non. En cas d' cd
échec, ls
imprimera le contenu de votre répertoire actuel, ce qui déroutera l'utilisateur. En tant que meilleure pratique, utilisez &&
et non ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
En règle générale, il est déconseillé de renommer une commande existante, en particulier pour une commande appelée, par exemple cd
. Au lieu de cela, créez une nouvelle commande avec un nom différent. Si vous écrasez cd
avec une fonction ou un alias également nommé cd
, qu'arrivera-t-il lorsque vous entrerez dans un répertoire contenant 100 000 fichiers? Il existe de nombreux utilitaires qui utilisent cd
, et ils peuvent être déroutés par ce comportement inhabituel. Si vous utilisez un compte partagé (par exemple root
lorsque vous travaillez avec d'autres administrateurs système), il peut s'avérer très dangereux de remplacer une commande existante car l'environnement est différent de celui attendu par les utilisateurs.
pwd
. Pas sûr que ce soit une bonne pratique, mais c'est couramment fait. Voir tldp.org/LDP/abs/html/aliases.html pour quelques exemples.
cd() { builtin cd "$@" && pwd; };
- en utilisant shell standard bourne sur macOS (Sierra 10.12.6)
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 suit ne concerne que les sessions interactives, donc cela n’affecte pas le cd
comportement des scripts.
[ -z "$PS1" ] && return
?
[ -z "$PS1" ]
vérifie si $PS
(variable d'invite interactive) est "longueur zéro" (-z). Si sa longueur est égale à zéro, cela signifie qu'il n'a pas été défini. Bash ne doit donc pas être exécuté en mode interactif. La && return
pièce quitte le sourcing .bashrc
à ce stade, dans ces conditions.
i
dans "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
variable peut être non définie ou vide et le shell peut toujours être interactif (mais sans invite). Je vérifierais $-
pour être sûr.
hors sujet, puisque la question est marquée / bash, mais que certaines questions sont fermées comme une copie de celle-ci sans mentionner bash:
Avec zsh:
chpwd() ls
La fonction chpwd () est appelée par zsh chaque fois que le répertoire en cours change (via cd, pushd, popd ...). tcsh a une fonctionnalité similaire et c'est probablement d'où zsh l'a obtenue.
Pourquoi ne pas ajouter un alias à votre fichier .bashrc?
Quelque chose comme:
alias cdls='cd "$@" && ls'
La solution habituelle consistant à créer un alias pour la commande cd n’est pas parfaite, car il existe d’autres commandes qui peuvent modifier votre répertoire actuel, comme Popd, ou même l’exécution d’un script contenant la commande cd.
Il est préférable d'utiliser le crochet Bash $ PROMPT_COMMAND qui exécute une commande avant de renvoyer une invite.
La commande (une fonction dans notre cas) ne sera exécutée que si le répertoire a été modifié pour réduire le bruit d'é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
Copier 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...
En bash, vous ne pouvez pas avoir recours à des alias pour les actions nécessitant un paramètre. Pour cela, il y a des fonctions. Alors mettez dans ~/.bashrc
le suivant
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Placez le code ci-dessous dans le fichier .profile et cela fonctionne. Testé sur 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"
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' histoire dirs pop juste cette commande: popd
.
J'ai ajouté else
afin que vous verrez une erreur lorsque vous essayez d'accéder à un mauvais répertoire.
Je pense qu’il est bon d’activer ls
les options de cette manière, car cela cd
ne prend aucune option.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
prend des options.
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
alias cd='builtin cd $1 && ls -l && builtin cd $1'