web-dev-qa-db-fra.com

Est-il possible de remplacer la commande "CD" intégrée de la ligne de commande?

Il suffit de chaque fois que je 'CD' à un répertoire différent de ma machine (dans ce cas, exécutant Mac OS X 10.6.7) via la ligne de commande (qui est bash), je saisis immédiatement "LS" pour obtenir la liste des matières dans ce répertoire. J'essaie de trouver un moyen de remplacer "CD" afin qu'il change dans le répertoire demandé puis me donne la liste dans un coup.

J'ai été en mesure d'obtenir la fonctionnalité 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. Changer dans le répertoire demandé puis me montrant le contenu. Lorsque je rencontre dans un problème, c'est essayer de remplacer "CD" lui-même au lieu de créer une nouvelle commande "CL".

Les choses suivantes ne pas travail

##### 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 de faire un alias qui pointe sur la fonction "CL" de travail. Aucun d'entre eux n'a fonctionné.

Ce que j'ai lu dans la documentation, des discussions sur le fait que 'CD' ne peut pas être exécuté comme une commande externe (ce que je comprends comme la manière 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:

Y a-t-il un moyen de remplacer le comportement du "CD" pour qu'il ait changé dans le répertoire demandé, puis faire autre chose après?

23
Alan W. Smith

Je suggère de ne pas remplacer le CD car il existe d'autres scripts qui détournent la fonction "CD", par exemple, RVM. Il serait préférable de choisir un autre nom, comme "D", plutôt et ne spécifiez pas le type "intégré" dans votre fonction; Sinon, le piratage ne fonctionnerait pas. J'utilise le code ci-dessous:

function d() { cd "$@" && ls;} 
6
Wen