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

Bash
pwd [-L | -P]
Parameter
-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.

Bash Beispiel
pwd
Output
/home/user/Documents

Builtin 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.

Bash Welches pwd läuft?
type pwd
type -a pwd
Output
pwd is a shell builtin
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd

Der Unterschied ist subtil, aber wichtig:

VarianteQuelleVerhalten
Shell-BuiltinIn Bash/Zsh integriertLiest standardmäßig $PWD aus, sehr schnell, keine Prozess-Erzeugung
/bin/pwdGNU CoreutilsErmittelt 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.

Bash Binary erzwingen
command pwd
/bin/pwd

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.

Bash Symlink-Demo
mkdir -p /tmp/echt/tief
ln -s /tmp/echt /tmp/link
cd /tmp/link/tief
pwd
pwd -L
pwd -P
Output
/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:

VariableInhalt
$PWDAktueller logischer Pfad — wird bei jedem cd aktualisiert
$OLDPWDDer vorherige Pfad — Ziel von cd -
Bash Variablen lesen
echo "$PWD"
cd /etc
echo "$OLDPWD"
cd -
Output
/home/user
/home/user
/home/user

Das 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.

Bash Skript-Anker
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

/ Weiter

Zurück zu Dateisystem

Zur Übersicht