À peu près à chaque fois que je «cd» vers un répertoire différent sur ma machine (dans ce cas, exécutant Mac OS X 10.6.7) via la ligne de commande (qui est bash), je tape immédiatement «ls» pour obtenir la liste des contenus dans ce répertoire. J'essaie de trouver un moyen de remplacer 'cd' afin qu'il change dans le répertoire demandé et me donne ensuite la liste en une seule fois.
J'ai pu obtenir les fonctionnalités de base que je cherche à travailler avec la ligne suivante ajoutée à mon ~ / .bash_profile
function cl() { cd "$@"; ls -l; }
Cela fonctionne comme prévu. Passer au répertoire demandé puis me montrer le contenu. Là où je rencontre un problème, j'essaie de remplacer "cd" lui-même au lieu de créer une nouvelle commande "cl".
Les choses suivantes ne fonctionnent pas
##### Attempt 1 #####
# Hangs the command line
function cd() { cd "$@"; ls -l; }
##### Attempt 2 #####
# Hangs the command line
function cd() { 'cd' "$@"; ls -l; }
##### Attempt 3 #####
# Does not change directory.
# Does list contents, but of the directory where you started.
function cd() { /usr/bin/cd "$@"; ls -l; }
#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;
J'ai également essayé plusieurs autres itérations qui ne sont pas répertoriées ainsi que la création d'un alias qui pointe vers la fonction «cl» de travail. Rien de tout cela n'a fonctionné.
Ce que j'ai lu dans la documentation parle du fait que 'cd' ne peut pas être exécuté comme une commande externe (c'est ce que je comprends être la façon dont la fonction devrait l'utiliser).
Donc, je peux actuellement utiliser ma commande "cl" et obtenir ce que je veux, mais la question est / reste:
Existe-t-il un moyen de remplacer le comportement de 'cd' pour qu'il change dans le répertoire demandé et fasse ensuite autre chose?
la source
cd ""
(à quoi cette réponse devrait évaluer est différent decd "$@"
vide$@
. Désolé de la confusion.Je pense que vous courez dans une boucle. Votre
cd
fonction appellecd
, ce qui est ... la fonction.Vous devez savoir
builtin
quel est un mot-clé qui permet à la recherche de commandes d'utiliser les commandes internes de Bash comme cd et non votre fonctionDe plus, l'appel
/usr/bin/cd
ne fonctionnera jamais, même si une telle commande existait.Ce qui se passerait:
/bash/dir
./usr/bin/cd /dir/for/cd
./usr/bin/cd
va au dir/dir/for/cd
./usr/bin/cd
sort./bash/dir
, car le processus enfant ne/usr/bin/cd
peut pas affecter le parent.Les alias sont également de simples substitutions de texte. Ils ne peuvent jamais avoir de paramètres.
la source
builtin cd $@ && ls
; car l'cd
appel doit réussir pour que tout le reste ait du sens. N'oubliez pas non plus les cas particuliers tels quecd
(aucun argument).Je suggère de ne pas remplacer le cd car il existe d'autres scripts détournant la fonction «cd», par exemple, rvm. Il serait préférable de choisir un autre nom, comme «d», à la place et de ne pas spécifier le type «intégré» dans votre fonction; sinon, le pirate de l'air ne fonctionnerait pas. J'utilise le code ci-dessous:
la source