Der Befehl pwd (kurz für print working directory) gibt das aktuelle Arbeitsverzeichnis aus — also den Pfad des Ordners, in dem du dich gerade befindest. Klingt trivial, hat aber drei Feinheiten, die in Skripten und beim Arbeiten mit Symlinks regelmäßig für Überraschungen sorgen: Builtin gegen Binary, logischer gegen physischer Pfad und die Rolle der Umgebungsvariable $PWD.
Syntax
pwd [-L | -P]-L Logical — Voreinstellung. Gibt den Pfad so aus, wie ihn die Shell sieht, inklusive durchlaufener Symlinks. Liest in der Regel die Variable $PWD.
-P Physical — Löst alle Symlinks auf und gibt den tatsächlichen Pfad im Dateisystem aus.
pwd/home/user/DocumentsBuiltin vs. Binary
Auf den ersten Blick gibt es nur ein pwd. Tatsächlich existieren zwei Implementierungen parallel: das Shell-Builtin (in Bash, Zsh, Dash usw. eingebaut) und das Binary unter /bin/pwd aus den GNU Coreutils. Mit type erkennst du, was die Shell standardmäßig nimmt.
type pwd
type -a pwdpwd is a shell builtin
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwdDer Unterschied ist subtil, aber wichtig:
| Variante | Quelle | Verhalten |
|---|---|---|
| Shell-Builtin | In Bash/Zsh integriert | Liest standardmäßig $PWD aus, sehr schnell, keine Prozess-Erzeugung |
/bin/pwd | GNU Coreutils | Ermittelt den Pfad per getcwd()-Syscall, immer physisch korrekt |
Mit command pwd oder direkt /bin/pwd erzwingst du das externe Binary — nützlich, wenn du dem Builtin nicht traust oder $PWD möglicherweise manipuliert wurde.
command pwd
/bin/pwdLogisch vs. physisch — Symlinks im Spiel
Solange dein Pfad keine Symlinks enthält, liefern pwd -L und pwd -P dasselbe Ergebnis. Sobald aber irgendein Verzeichnis im aktuellen Pfad ein symbolischer Link ist, divergieren die Werte.
mkdir -p /tmp/echt/tief
ln -s /tmp/echt /tmp/link
cd /tmp/link/tief
pwd
pwd -L
pwd -P/tmp/link/tief
/tmp/link/tief
/tmp/echt/tief-L zeigt den Weg, den du gegangen bist (über den Symlink), -P den Weg, an dem du wirklich stehst. In Skripten, die Pfade vergleichen oder Dateien manipulieren, ist pwd -P fast immer die sicherere Wahl.
$PWD und $OLDPWD
Die Shell pflegt zwei spezielle Umgebungsvariablen rund um das aktuelle Verzeichnis:
| Variable | Inhalt |
|---|---|
$PWD | Aktueller logischer Pfad — wird bei jedem cd aktualisiert |
$OLDPWD | Der vorherige Pfad — Ziel von cd - |
echo "$PWD"
cd /etc
echo "$OLDPWD"
cd -/home/user
/home/user
/home/userDas Builtin pwd greift in der Regel direkt auf $PWD zu — daher ist es so schnell. Mehr zu Umgebungsvariablen findest du im Artikel Umgebung & Variablen.
Praktische Verwendung
pwd ist trotz seiner Einfachheit in vielen Situationen nützlich:
Anker in Shell-Skripten
Ein Klassiker: das Verzeichnis ermitteln, in dem ein Skript liegt — unabhängig davon, von wo es aufgerufen wird.
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
echo "Skript liegt in $SCRIPT_DIR"Mit pwd -P statt pwd bekommst du den physischen Pfad, falls über Symlinks aufgerufen wird.
Im Prompt
Viele PS1-Konfigurationen zeigen das aktuelle Verzeichnis an — meist über \w (verkürzt) oder \W (nur Basename). Beides liest intern $PWD.
Logging und Diagnose
In Logs ein einfaches echo "Working dir: $(pwd)" einzubauen, hilft beim Nachvollziehen, wo ein fehlgeschlagener Befehl ausgeführt wurde — besonders bei CI-Pipelines.
Besonderheiten
Builtin und Binary verhalten sich nicht identisch
Das Shell-Builtin liest standardmäßig $PWD. Wer die Variable manipuliert (PWD=/foo pwd), bekommt eine Lüge präsentiert. /bin/pwd hingegen ruft getcwd(3) auf und liefert den echten Kernel-Pfad. Im Zweifel command pwd oder direkt /bin/pwd verwenden — gerade in sicherheitskritischen Skripten.
Symlinks sind tückisch
Wenn du per Symlink in ein Verzeichnis gewechselt bist, zeigt pwd standardmäßig den Symlink-Pfad. Das ist menschenfreundlich, kann aber zu falschen Annahmen führen — etwa wenn du Pfade vergleichst oder relative Sprünge mit .. machst. Für deterministisches Verhalten ist pwd -P oder realpath . die richtige Wahl.
In gelöschten Verzeichnissen wird es seltsam
Wenn dein aktuelles Verzeichnis von einem anderen Prozess gelöscht wird, steht dein Shell-Prozess in einem Phantom-Pfad. Das Builtin liefert weiterhin den alten $PWD-Wert, /bin/pwd dagegen schlägt fehl oder zeigt etwas wie (unreachable)/…. Mit cd ohne Argument kommst du wieder ins Home und damit zurück in einen gültigen Zustand.
Auf Windows-Subsystemen zeigt pwd Posix-Pfade
Unter Cygwin, MSYS2, MinGW oder Git Bash wandelt pwd Windows-Pfade in eine Posix-Notation um — etwa /c/Users/Max statt C:\Users\Max. Wer den Windows-Pfad braucht, nimmt cygpath -w ”$(pwd)” oder unter WSL wslpath -w ”$(pwd)”.
Alternativen: realpath und readlink -f
Wer mehr Kontrolle möchte, greift zu realpath oder readlink -f. Beide lösen einen beliebigen Pfad in seine kanonische Form auf — Symlinks weg, .. aufgelöst, alles absolut. Praktisch in Skripten, in denen du Pfade nicht nur anzeigen, sondern weiterverarbeiten willst.
Weiterführende Ressourcen
Externe Quellen
- pwd – POSIX Manpage (man7.org) — Offizielle Spezifikation des Befehls
- GNU Coreutils: pwd — Dokumentation des
/bin/pwd-Binarys - Bash Reference Manual: Bash Builtins —
pwdals Shell-Builtin im Detail - Arch Wiki: Core utilities — Überblick über die GNU-Standardwerkzeuge
Verwandte Artikel
- cd – Verzeichnis wechseln — Das Gegenstück zu
pwd - ls – Verzeichnisinhalt anzeigen — Was im aktuellen Verzeichnis liegt
- Linux Dateisystem — Übersicht über Pfade, Verzeichnisse und Werkzeuge
- Umgebung & Variablen —
$PWD,$OLDPWDund Co. im Kontext - Linux Shell — Builtins, Binaries und wie die Shell auflöst