Linux / Commande pwd : afficher le répertoire courant avec -L et -P

pwd, abréviation de print working directory, affiche le chemin du répertoire de travail courant. Utilisez pwd -L pour conserver un chemin logique valide pouvant contenir des liens symboliques, et pwd -P pour afficher le chemin physique sans ces composants de lien.

Le répertoire de travail est le point de départ des chemins relatifs. Il appartient au processus : il ne correspond pas forcément au dossier dans lequel un script est enregistré, ni au répertoire personnel de l’utilisateur.

Situer le répertoire de travail

pwd
cd /var/log && pwd

Le premier résultat dépend de votre position. Le second s’affiche uniquement si le déplacement réussit ; sur un système où /var/log existe et vous est accessible, il indique cette position selon la représentation choisie par votre shell.

Un chemin comme config/site.ini est relatif à ce répertoire. Le même texte peut donc désigner deux fichiers différents depuis deux positions différentes. Un chemin absolu part au contraire de la racine, avec une barre oblique initiale.

pwd affiche un chemin absolu et n’accepte pas de dossier à examiner comme opérande. Pour changer de position, utilisez cd et ses règles de déplacement. Pour résoudre un autre chemin sans vous déplacer, choisissez un outil de résolution de chemins plutôt que d’ajouter ce chemin à pwd.

Distinguer le pwd de Bash et le programme GNU

Identifier la commande réellement utilisée

type -a pwd
command -V pwd
help pwd
env pwd --version

Bash fournit une commande intégrée pwd et le système peut aussi fournir un programme externe GNU Coreutils. Un alias ou une fonction peut encore intervenir. Les chemins affichés par type dépendent de l’installation ; ne supposez pas que le programme externe se trouve au même emplacement sur tous les systèmes.

builtin pwd -P appelle explicitement la commande intégrée de Bash. env pwd -P demande un programme externe trouvé par PATH ; vérifiez sa version pour confirmer qu’il s’agit de GNU pwd. command pwd peut encore utiliser une commande intégrée : cette forme ne force pas à elle seule le programme externe.

Le guide de command et de la résolution des commandes détaille le rôle de ces appels. Les options longues GNU ne doivent pas être supposées valides pour le builtin de votre shell.

Choisir explicitement -L ou -P

Appel But
builtin pwd -L Chemin logique valide conservé par Bash.
builtin pwd -P Chemin physique du Bash courant.
env pwd --logical Option longue de GNU pwd correspondant à -L.
env pwd --physical Option longue de GNU pwd correspondant à -P.

Dans l’usage habituel de Bash, le builtin sans option est logique. L’option de shell set -o physical peut modifier ce comportement. Le programme GNU externe utilise au contraire -P par défaut, sauf si POSIXLY_CORRECT est défini. Indiquer -L ou -P rend l’intention plus claire dans un script.

Pour GNU pwd, si les deux options sont données, la dernière s’applique. Le manuel de GNU pwd décrit ces valeurs par défaut et les conditions d’utilisation du chemin logique. La spécification POSIX de pwd définit les formes portables -L et -P.

Comprendre les chemins logiques, physiques et PWD

Observer les liens avec un exercice complet

Un lien symbolique est un chemin renvoyant vers un autre chemin. Dans un emplacement où demo-pwd-liens n’existe pas, ce bloc Bash crée un petit exemple sur un système permettant les liens symboliques :

(
  mkdir -- demo-pwd-liens || exit 1
  mkdir -p -- demo-pwd-liens/reel/projet || exit 1
  ln -s -- reel/projet demo-pwd-liens/courant || exit 1
  CDPATH= cd -L -- ./demo-pwd-liens/courant || exit 1
  builtin pwd -L
  builtin pwd -P
  env pwd -L
  env pwd -P
)

Les lignes logiques doivent finir par /demo-pwd-liens/courant ; les lignes physiques doivent finir par /demo-pwd-liens/reel/projet. Les deux noms désignent ici le même répertoire au moment de l’observation.

Les parenthèses préservent la position de votre shell appelant. Les dossiers et le lien restent sur disque pour inspection ; retirez ensuite ce seul exercice après avoir confirmé son contenu. Le premier mkdir refuse un dossier déjà présent au lieu de réutiliser silencieusement d’anciens fichiers.

Le chemin physique décrit le répertoire de travail du processus. Si un lien de déploiement est repointé après le déplacement, votre processus ne se déplace pas automatiquement vers sa nouvelle cible. Pour examiner la cible actuelle d’un lien donné, interrogez ce lien séparément.

Ne pas confondre commande et variables

Élément Rôle
pwd Commande qui détermine et affiche une représentation de la position courante.
PWD Variable dans laquelle le shell conserve normalement le chemin logique courant.
OLDPWD Position précédente utilisée notamment par cd - ; ce n’est pas un historique complet.
printf '%s\n' "$PWD"
printf '%s\n' "${OLDPWD-}"
builtin pwd -L
builtin pwd -P

La forme ${OLDPWD-} permet un affichage vide si la variable n’existe pas. Le fait qu’une variable contienne un chemin n’établit pas qu’il correspond à la véritable position du processus ; réécrire PWD ne remplace pas cd.

GNU pwd -L utilise PWD si sa valeur décrit réellement le répertoire courant par un chemin absolu sans composants . ou ... Sinon il revient au traitement physique. Il ne se contente donc pas d’afficher aveuglément une chaîne. Évitez de modifier PWD pour fabriquer un résultat ; interrogez directement la représentation nécessaire.

Distinguer la position d’un script et celle de son fichier

Un processus enfant hérite normalement du répertoire de travail de son parent. Le chemin du fichier script peut désigner un autre répertoire. Pour observer cette différence, créez un nouvel exercice :

(
  mkdir -- demo-pwd || exit 1
  mkdir -- demo-pwd/scripts demo-pwd/depart
)

Enregistrez le script complet suivant dans demo-pwd/scripts/inspecter.sh :

#!/usr/bin/env bash
position=$(builtin pwd -P) || {
  printf '%s\n' 'Impossible de determiner le repertoire courant.' >&2
  exit 1
}
printf 'Repertoire de travail : %s\n' "$position"

Depuis le parent de demo-pwd, lancez-le avec Bash en vous plaçant dans l’autre sous-répertoire :

(
  CDPATH= cd -- ./demo-pwd/depart || exit 1
  bash ../scripts/inspecter.sh
)

Le chemin affiché doit finir par /demo-pwd/depart, et non par /scripts. Aucune permission d’exécution sur inspecter.sh n’est nécessaire puisqu’il est lu par Bash. Le sous-shell laisse votre terminal dans sa position de départ.

Pour obtenir le dossier contenant le script, il faut définir une autre règle, tenant compte du shell, de son mode d’appel et du suivi éventuel des liens du script. pwd répond uniquement à la question de la position courante du processus qui l’exécute.

Un service, une tâche planifiée ou une chaîne d’intégration continue peut démarrer avec une autre position qu’un terminal interactif. Définissez le répertoire de travail dans son lanceur ou utilisez des chemins absolus adaptés ; ne supposez pas que le dossier d’un script devient automatiquement sa position courante.

Conserver un résultat et vérifier les erreurs

Le script précédent contrôle la réussite de pwd avant d’utiliser sa sortie. Il renvoie 1 avec un diagnostic si le chemin ne peut pas être déterminé. Les guillemets autour de "$position" conservent ensuite les espaces comme partie de la valeur.

Une subtilité de la substitution de commande subsiste : $(...) retire tous les sauts de ligne finaux de la sortie. Pour les chemins habituels de l’exercice, cela retire seulement le saut de ligne ajouté par pwd. Sous Linux, un nom de répertoire peut cependant se terminer lui-même par un saut de ligne.

Si ce cas doit être préservé exactement dans un traitement Bash, ajoutez un marqueur après la sortie, puis retirez ce marqueur et un seul saut de ligne terminal :

(
  position=$(builtin pwd -P && printf '.') || exit 1
  position=${position%.}
  position=${position%$'\n'}
  printf 'Representation Bash : %q\n' "$position"
)

Le point empêche la substitution de supprimer les sauts de ligne précédents. Les deux suppressions retirent ensuite ce point et le seul saut de ligne de présentation de pwd. La forme $'\n' et printf '%q' sont propres à Bash dans cet exemple. L’opérateur && empêche le marqueur de transformer un échec de pwd en réussite.

Cette technique ne rend pas disponible un chemin que le système ne peut pas déterminer. Elle ne doit pas remplacer le contrôle du statut ni servir à reconstruire des chemins en découpant des sorties destinées à l’écran.

Diagnostiquer une position absente ou inattendue

  • Le nom contient un lien symbolique. Comparez explicitement pwd -L et pwd -P, puis choisissez le point de vue correspondant à votre tâche.
  • Le résultat varie entre deux appels. Vérifiez le builtin, le programme externe, les fonctions et les réglages du shell. Un déplacement intervenu dans une autre session ne déplace pas la session actuelle.
  • Le chemin courant ne peut pas être retrouvé. Le répertoire ou un de ses parents peut avoir été supprimé, renommé ou rendu inaccessible. Les conditions de récupération du chemin dépendent du système et de l’implémentation.
  • Une automatisation ne retrouve pas un fichier relatif. Contrôlez sa vraie position de lancement et les chemins utilisés, au lieu de déduire la position à partir de celle du script.

Pour retrouver une position connue, vous pouvez rejoindre un chemin absolu accessible puis vérifier le résultat, par exemple cd / && pwd -P. Examinez ensuite ce qui a changé dans l’ancien chemin. Un pwd logique peut encore afficher un nom mémorisé dans certaines situations ; un ancien affichage ne prouve pas que ce nom reste accessible.