Wer mit Visual Studio Code DevContainern arbeitet und zsh als Standardshell nutzt, kann auf ein ärgerliches Problem stoßen: Statt die gewohnte ~/.zshrc
zu laden und die History in ~/.zsh_history
zu speichern, verwendet VSCode plötzlich ein temporäres Verzeichnis, etwa /tmp/xyz-code-zsh/.zsh_history
. Damit gehen wichtige Shell-Einstellungen verloren und die History ist nicht mehr persistent.
Ursache
VSCode setzt beim Starten eines DevContainers die Variable ZDOTDIR
auf ein temporäres Verzeichnis. Da zsh seine Konfigurationsdateien standardmäßig in $ZDOTDIR
sucht, werden nicht mehr die Dateien im Home-Verzeichnis geladen, sondern eben die im temporären Pfad. Folglich greift auch die falsche History-Datei.
Lösung
Die einfachste und robusteste Lösung besteht darin, systemweit zu erzwingen, dass zsh immer die .zshrc
aus dem Home-Verzeichnis lädt. Dazu wird die Datei /etc/zsh/zshenv
angepasst, denn sie wird immer als erstes geladen – noch bevor ZDOTDIR
berücksichtigt wird.
# /etc/zsh/zshenv
# Immer $HOME für ZDOTDIR verwenden
export ZDOTDIR="$HOME"
# Bei interaktiven Shells die Home-.zshrc laden
if [[ -o interactive ]] && [[ -r "$HOME/.zshrc" ]] && [[ -z "$__HOME_ZSHRC_SOURCED" ]]; then
export __HOME_ZSHRC_SOURCED=1
source "$HOME/.zshrc"
fi
Damit wird unabhängig von VSCode immer die richtige Konfiguration aus /home/<user>/.zshrc
geladen. Auch die History landet wieder zuverlässig in ~/.zsh_history
.
Dockerfile-Integration
Wer eigene DevContainer-Images baut, sollte den Fix gleich im Dockerfile verankern. So ist das Verhalten reproduzierbar und funktioniert auch nach einem Neuaufsetzen des Containers.
RUN printf '%s\n' \
'# Always use $HOME for zsh config (override VS Code tmp ZDOTDIR)' \
'export ZDOTDIR="$HOME"' \
'' \
'# Load user ~/.zshrc for interactive shells (avoid double-sourcing)' \
'if [[ -o interactive ]] && [[ -r "$HOME/.zshrc" ]] && [[ -z "$__HOME_ZSHRC_SOURCED" ]]; then' \
' export __HOME_ZSHRC_SOURCED=1' \
' source "$HOME/.zshrc"' \
'fi' \
>> /etc/zsh/zshenv
Fazit
Das Problem mit der falschen .zshrc
und der temporären History-Datei tritt in vielen DevContainer-Umgebungen auf, wenn VSCode ZDOTDIR
auf ein eigenes Verzeichnis setzt. Mit einem kleinen Patch in /etc/zsh/zshenv
lässt sich dieses Verhalten dauerhaft korrigieren. So bleiben die gewohnten zsh-Einstellungen und die Shell-History auch in DevContainern konsistent erhalten.
Troubleshooting
Um sicherzustellen, dass der Patch in /etc/zsh/zshenv
korrekt greift, lassen sich die wichtigsten Variablen direkt abfragen. Öffne ein Terminal im DevContainer und führe folgende Befehle aus:
# Zeigt, wo zsh seine Konfigurationsdateien sucht
echo $ZDOTDIR
# Erwartet: /home/<user>
# Prüft, welche History-Datei tatsächlich verwendet wird
echo $HISTFILE
# Erwartet: /home/<user>/.zsh_history
# Testlauf: neue interaktive Shell starten und Variablen prüfen
zsh -ilc 'echo "ZDOTDIR=$ZDOTDIR HISTFILE=$HISTFILE"'
# Erwartet: ZDOTDIR=/home/<user> HISTFILE=/home/<user>/.zsh_history
Wenn die Ausgaben wie erwartet aussehen, lädt zsh nun zuverlässig die eigene .zshrc
und schreibt die History wieder ins Home-Verzeichnis.
Schreibe einen Kommentar
Du musst angemeldet sein, um einen Kommentar abzugeben.