Linux / Commande cd : changer de répertoire dans Bash
cd change le répertoire de travail du shell : un chemin absolu part de /, un chemin relatif part de la position courante, cd sans argument rejoint le répertoire personnel et cd - revient à la position précédente. Dans un script Bash, vérifiez toujours la réussite du déplacement avant d’exécuter les commandes qui en dépendent.
Ce guide utilise Bash. cd est une commande intégrée au shell, car un programme enfant ne peut pas changer le répertoire de travail de son parent. Le nom signifie change directory, « changer de répertoire » ; les fichiers eux-mêmes ne sont ni déplacés ni renommés.
Choisir un chemin absolu ou relatif
Commencez par afficher votre position, puis contrôlez le résultat après le déplacement :
pwd
cd /var/log
pwd
Le premier affichage dépend de votre point de départ. Si le déplacement réussit, le second indique /var/log, sous réserve de la représentation logique des liens expliquée plus bas. Ce répertoire doit exister et être accessible.
| Forme | Point de départ et résultat |
|---|---|
cd /etc |
Chemin absolu, interprété depuis la racine du système de fichiers. |
cd ./projet |
Chemin relatif explicite vers le sous-répertoire projet de la position courante. |
cd .. |
Parent, selon le traitement logique ou physique choisi. |
cd ../.. |
Deux niveaux parents ; les deux composants sont séparés par une barre oblique. |
cd . |
Répertoire courant, sans déplacement habituel. |
cd / |
Racine du système de fichiers, différente du répertoire personnel de root. |
Un nom tel que ... ne signifie pas « deux parents » dans Bash. Il désigne un nom ordinaire. Un chemin relatif dépend de la position actuelle ; ./ permet aussi d’éviter la recherche par CDPATH.
Pour vérifier la commande réellement utilisée et consulter l’aide de votre Bash :
type -a cd
help cd
Un alias ou une fonction peut modifier l’usage habituel. La commande builtin cd appelle directement la commande intégrée de Bash. Le guide de type et de la résolution des commandes explique cette distinction.
Rejoindre le répertoire personnel et la position précédente
Comprendre HOME et le développement de ~
cd
cd ~
cd "$HOME/Downloads"
Sans argument, Bash utilise la variable HOME. Un ~ non protégé est développé par le shell avant l’appel de la commande. Les deux premières formes rejoignent normalement le même emplacement ; la dernière nécessite un sous-répertoire Downloads existant, dont le nom peut différer selon votre installation.
Les guillemets changent le sens du tilde : cd "~/Downloads" cherche un chemin commençant littéralement par ~. Utilisez cd ~/Downloads ou cd "$HOME/Downloads". Une chaîne placée dans une variable n’est pas automatiquement soumise à un second développement du tilde.
cd ~alice utilise le répertoire personnel associé au compte alice, s’il existe et si vous pouvez y accéder. Cela ne change pas votre identité. Lorsque HOME est absent, ne supposez pas que cd et cd ~ sont équivalents : Bash signale l’absence de HOME pour le premier, tandis que le tilde peut utiliser les informations du compte. Le manuel du développement du tilde précise ces règles.
Revenir avec cd - et lire PWD et OLDPWD
cd /etc
cd /var/log
cd -
printf 'Position courante : %s\n' "$PWD"
printf 'Position precedente : %s\n' "$OLDPWD"
Si tous les déplacements réussissent, cd - revient dans /etc et affiche ce chemin. Un nouvel appel permet de revenir dans /var/log. PWD désigne le chemin courant mémorisé par Bash et OLDPWD la position précédant le dernier déplacement réussi.
OLDPWD n’est pas un historique de toutes les positions. Il peut manquer au démarrage d’un shell, d’où le diagnostic OLDPWD not set. Évitez de réécrire PWD pour simuler un déplacement : changer la variable ne change pas le véritable répertoire de travail du processus.
Protéger les espaces et les noms commençant par un tiret
cd -- './Projet commun'
cd ./-archive
Ces exemples supposent des répertoires existants à l’endroit où vous les lancez. Les guillemets conservent un chemin avec espaces comme un seul argument. Pour une variable, utilisez des guillemets doubles afin de conserver sa valeur sans découpage ni développement de motifs :
destination='/srv/donnees partagees'
cd -- "$destination"
-- termine les options de Bash cd ; ./-archive donne en plus un chemin relatif explicite. Une particularité subsiste : cd -- - signifie toujours « revenir à OLDPWD ». Pour rejoindre un répertoire dont le nom est exactement -, utilisez cd ./-. Le script complet plus bas normalise les chemins relatifs pour traiter aussi ce cas.
L’autocomplétion avec Tab aide à choisir un nom réel et à protéger les espaces, mais contrôlez le chemin obtenu avant de lancer la commande. La casse des noms compte généralement sur les systèmes de fichiers Linux courants.
Choisir le chemin logique ou physique avec -L et -P
Un lien symbolique est un chemin qui renvoie vers un autre chemin. Par exemple, un lien raccourci peut pointer vers physique/enfant. Le parent du nom utilisé et le parent de sa cible ne sont alors pas le même répertoire.
Observer la différence dans un exercice isolé
Dans un répertoire de travail où demo-cd n’existe pas, exécutez ce bloc complet sur un système permettant la création de liens symboliques :
(
mkdir -- demo-cd || exit 1
mkdir -p -- demo-cd/physique/enfant || exit 1
ln -s -- physique/enfant demo-cd/raccourci || exit 1
CDPATH= cd -- ./demo-cd || exit 1
base=$PWD
cd -L -- "$base/raccourci/.." || exit 1
printf 'Parent logique : %s\n' "$PWD"
cd -P -- "$base/raccourci/.." || exit 1
printf 'Parent physique : %s\n' "$PWD"
)
Le premier résultat finit par /demo-cd : -L traite le composant raccourci/.. selon la structure logique du chemin. Le second finit par /demo-cd/physique : -P résout la cible du lien avant de traiter le parent.
Les parenthèses conservent la position de votre shell appelant. Elles ne retirent pas les objets créés : le dossier demo-cd reste disponible pour inspection. Vous pouvez ensuite supprimer ce dossier d’exercice après avoir vérifié son contenu. Le premier mkdir refuse un dossier déjà présent au lieu d’y mêler l’exercice.
Choisir et vérifier la représentation voulue
pwd -L
pwd -P
pwd -L montre la représentation logique valide et pwd -P la représentation physique. Dans l’usage Bash habituel, cd est logique ; l’option du shell set -o physical peut modifier cette préférence. Indiquez explicitement -L ou -P quand cette différence fait partie de votre procédure.
cd -P -e chemin renvoie un échec si le déplacement a eu lieu mais que Bash ne peut pas déterminer le chemin physique courant. Ce cas distingue le statut de retour d’une simple garantie que rien n’a changé. -@, présent dans l’aide de certaines compilations, concerne des systèmes exposant les attributs étendus comme des répertoires ; ce n’est pas une option générale d’exploration des fichiers sous Linux.
Le manuel de cd et pwd intégrés à Bash décrit le traitement des liens, la mise à jour des variables et les conditions de sortie.
Utiliser CDPATH sans changer involontairement de cible
CDPATH est une liste de répertoires dans lesquels le shell cherche certains chemins relatifs de cd. Elle utilise le deux-points comme séparateur. Elle ne remplace pas PATH, qui sert à trouver des programmes.
(
CDPATH=.:"$HOME/projets":/srv/apps
cd -- exemple-app
)
Dans cet exemple, Bash essaie notamment ./exemple-app, puis exemple-app sous les autres emplacements de recherche. Les chemins doivent exister. Un élément vide désigne le répertoire courant, tandis que placer . en tête lui donne la priorité dans la liste. Une entrée non vide utilisée pour le déplacement peut provoquer l’affichage du nouveau chemin, y compris avec une entrée explicite ..
Les parenthèses limitent ici la configuration et le déplacement à l’exercice. Pour un usage interactif persistant, vous pourriez définir CDPATH dans votre configuration personnelle de Bash, après avoir choisi les emplacements souhaités. Un export n’est utile que si vous voulez aussi transmettre cette valeur aux processus enfants ; le Bash courant lit sa propre variable.
cd -- ./exemple-app
CDPATH= cd -- ./exemple-app
Il s’agit de deux formes alternatives, à lancer depuis le point de départ voulu. Le préfixe ./ exprime une recherche locale. Les chemins absolus, ou ceux commençant par un composant . ou .., n’utilisent pas cette recherche CDPATH. Une chaîne relative comme projets/application peut en revanche être concernée : la présence d’une barre oblique quelque part dans le chemin ne suffit pas à désactiver CDPATH.
CDPATH= devant la commande neutralise cette recherche pour l’appel dans l’usage Bash présenté. Évitez de récupérer un chemin avec $(cd dossier; pwd) sans contrôler l’échec et les sorties supplémentaires. La spécification POSIX de cd détaille la recherche et le cas particulier du nom -.
Exécuter une commande seulement après un déplacement réussi
Utiliser un sous-shell pour une tâche ponctuelle
Si le sous-répertoire projet existe, ce bloc liste ses éléments cachés ou visibles puis laisse votre shell dans sa position initiale :
(
CDPATH= cd -- ./projet || exit 1
printf 'Travail dans : %s\n' "$PWD"
ls -A -- .
)
printf 'Retour dans le shell appelant : %s\n' "$PWD"
Un déplacement impossible arrête le sous-shell avec 1 et empêche le ls. L’affichage final appartient au shell appelant et s’exécute dans les deux cas ; ce n’est pas une preuve de réussite du bloc. Pour conditionner une autre action au résultat, testez directement le statut du sous-shell.
La forme cd chemin && commande conditionne la commande suivante à la réussite de cd. La forme cd chemin; commande exécute la suite même après un échec. Ne comptez pas sur une position supposée avant une écriture ou une suppression.
Créer un script complet conservant les arguments
Enregistrez ce contenu dans un nouveau fichier executer-dans.sh. Le script accepte un répertoire puis une commande et ses arguments :
#!/usr/bin/env bash
if [ "$#" -lt 2 ] || [ -z "$1" ]; then
printf '%s\n' 'Usage : bash executer-dans.sh repertoire commande [argument...]' >&2
exit 64
fi
dossier=$1
shift
case $dossier in
/*) ;;
*) dossier=./$dossier ;;
esac
CDPATH= builtin cd -P -e -- "$dossier" || {
printf '%s\n' 'Impossible de rejoindre le repertoire demande.' >&2
exit 1
}
exec "$@"
Avec un dossier existant nommé projet :
bash executer-dans.sh ./projet pwd -P
Le résultat est le chemin physique de ce dossier. Aucun droit d’exécution sur le fichier script n’est nécessaire puisqu’il est lu par Bash. Votre terminal reste dans son répertoire initial : le script s’exécute comme un processus enfant.
Le code 64 est choisi par ce script pour les arguments insuffisants ou le répertoire vide ; 1 indique son refus de poursuivre après un échec de cd. Le préfixe ./ protège les chemins relatifs, notamment le nom -. Les guillemets de "$@" conservent les limites des arguments, y compris espaces et caractères * littéraux.
exec remplace le processus du script par la commande : son statut devient celui de la tâche, et une commande introuvable ou non exécutable provoque aussi un échec. Cette méthode fixe un contexte de travail ; elle n’isole pas la commande des autres fichiers ou ressources auxquels elle a accès.
Conserver plusieurs positions avec pushd et popd
Pour un simple aller-retour, cd - suffit. Pour mémoriser plusieurs positions, Bash fournit une pile de répertoires :
| Commande | Rôle dans l’usage simple |
|---|---|
pushd repertoire |
Ajoute une position à la pile et s’y déplace. |
popd |
Retire le sommet puis rejoint la nouvelle position au sommet. |
dirs -v |
Affiche les positions avec leurs indices ; ne se déplace pas. |
(
depart=$PWD
pushd /etc || exit 1
dirs -v
popd || exit 1
[ "$PWD" = "$depart" ] && printf '%s\n' 'Position initiale retrouvee.'
)
Si les opérations réussissent, l’exercice retrouve sa position initiale. pushd et popd affichent normalement la pile après leur opération. Des options comme -n modifient ce comportement en supprimant le déplacement ; consultez le manuel des commandes de pile de répertoires avant d’utiliser les rotations ou les suppressions par indice.
Comprendre les erreurs et les limites d’un déplacement
- No such file or directory. Vérifiez le point de départ avec pwd, la casse, les espaces et les liens symboliques. Un lien existant peut avoir une cible manquante.
- Not a directory. Un composant du chemin peut être un fichier ordinaire. Examinez-le avec
ls -ld -- cheminen remplaçant chemin par la cible voulue. - Permission denied. Sur Linux, traverser un chemin nécessite le droit de recherche, ou d’exécution, sur les répertoires concernés. Pouvoir lister un nom et pouvoir entrer dans ce répertoire sont des capacités distinctes. Les listes de contrôle d’accès, ou ACL, et les mécanismes de sécurité peuvent aussi intervenir.
- HOME ou OLDPWD absent. La forme sans argument et cd - dépendent de ces valeurs. Choisissez un chemin explicite si le contexte ne les fournit pas.
- Trop d’arguments. Vérifiez les guillemets autour d’un chemin contenant des espaces. cd attend un répertoire, pas une suite de composants séparés par des espaces.
Le guide de ls et des métadonnées explique l’examen des types et des permissions. Quand il est installé, namei -l /chemin/vers/dossier aide aussi à examiner les composants d’un chemin ; remplacez cet exemple par le chemin réel sans modifier les droits au hasard.
sudo cd /root ne peut pas faire déplacer votre shell appelant : sudo lance un autre processus, alors que cd agit dans le contexte du shell qui l’exécute. Si une opération autorisée requiert un autre utilisateur, choisissez le contexte de commande ou de shell prévu par la politique sudo, puis revenez à votre session habituelle lorsque l’opération est terminée.
Une fonction de shell ou un fichier exécuté avec source peut changer la position du shell courant. Une exécution normale avec bash fichier.sh ne le peut pas. Utilisez source uniquement pour un contenu vérifié, car ses effets peuvent aussi concerner variables, options et autres réglages du shell.




