Zsh

Zsh ist eine leistungsfähige Shell, die sowohl als interaktive Shell als auch als Interpreter für Skriptsprachen arbeitet. Während sie mit der POSIX sh kompatibel ist (nicht standardmäßig, nur wenn sie emulate sh ausgibt), bietet sie Vorteile wie verbesserte Tab-Vervollständigung und Globbing.

Die Zsh-FAQ bietet weitere Gründe, Zsh zu verwenden.

Installation

Bevor Sie beginnen, möchten Sie vielleicht sehen, welche Shell derzeit verwendet wird:

$ echo $SHELL

Installieren Sie das zsh-Paket. Um zusätzliche Vervollständigungsdefinitionen zu erhalten, installieren Sie auch das Paket zsh-completions.

Anfangskonfiguration

Stellen Sie sicher, dass Zsh korrekt installiert wurde, indem Sie den folgenden Befehl in einem Terminal ausführen:

$ zsh

Sie sollten nun zsh-newuser-install sehen, das Sie durch einige grundlegende Konfigurationsschritte führt. Wenn Sie dies überspringen möchten, drücken Sie q. Wenn Sie es nicht gesehen haben, können Sie es manuell aufrufen mit:

$ autoload -Uz zsh-newuser-install$ zsh-newuser-install -f
Hinweis: Stellen Sie sicher, dass die Größe Ihres Terminals mindestens 72×15 beträgt, sonst wird zsh-newuser-install nicht ausgeführt.

Zsh zu Ihrer Standardshell machen

Ändern Sie Ihre Shell auf /usr/bin/zsh. Siehe Kommandozeilen-Shell#Ändern der Standard-Shell.

Tipp: Wenn Sie die Bash ersetzen, sollten Sie einige Codes von ~/.bashrc nach ~/.zshrc (z.B. die Eingabeaufforderung und die Aliase) und von ~/.bash_profile nach ~/.zprofile (z.B. den Code, der das X Window System startet) verschieben.

Startup/Shutdown-Dateien

Tipp:

  • Siehe A User’s Guide to the Z-Shell für Erklärungen zu interaktiven und Login-Shells und was man in seine Startdateien packen sollte.
  • Du könntest in Betracht ziehen, einen Standardpfad für deine Zsh-Konfigurationsdateien zu implementieren.
Hinweis:

  • Wenn $ZDOTDIR nicht gesetzt ist, wird stattdessen $HOME verwendet.
  • Wenn die Option RCS in einer der Dateien nicht gesetzt ist, werden nach dieser Datei keine Konfigurationsdateien gelesen.
  • Wenn die Option GLOBAL_RCS in einer der Dateien nicht gesetzt ist, werden nach dieser Datei keine globalen Konfigurationsdateien (/etc/zsh/*) gelesen.

Beim Starten liest Zsh standardmäßig Befehle aus den folgenden Dateien in dieser Reihenfolge, sofern sie existieren.

  • /etc/zsh/zshenv Wird zum Setzen von Umgebungsvariablen für alle Benutzer verwendet; sie sollte keine Befehle enthalten, die eine Ausgabe erzeugen oder voraussetzen, dass die Shell an eine TTY angeschlossen ist. Wenn diese Datei existiert, wird sie immer gelesen, dies kann nicht überschrieben werden.
  • $ZDOTDIR/.zshenv Wird zum Setzen von Umgebungsvariablen für Benutzer verwendet; sie sollte keine Befehle enthalten, die Ausgaben produzieren oder davon ausgehen, dass die Shell an ein TTY angeschlossen ist. Wenn diese Datei existiert, wird sie immer gelesen.
  • /etc/zsh/zprofile Wird für die Ausführung von Befehlen beim Start für alle Benutzer verwendet, wird beim Start als Login-Shell gelesen. Bitte beachten Sie, dass es unter Arch Linux standardmäßig eine Zeile mit dem Quelltext /etc/profile enthält. Siehe Warnung unten, bevor Sie diese Zeile entfernen wollen!
    • /etc/profile Diese Datei sollte von allen POSIX sh-kompatiblen Shells beim Login gelesen werden: Sie richtet $PATH und andere Umgebungsvariablen und anwendungsspezifische (/etc/profile.d/*.sh) Einstellungen beim Login ein.
  • $ZDOTDIR/.zprofile Wird für die Ausführung von Benutzerbefehlen beim Start verwendet, wird beim Start als Login-Shell gelesen. Wird typischerweise verwendet, um grafische Sitzungen automatisch zu starten und sitzungsweite Umgebungsvariablen zu setzen.
  • /etc/zsh/zshrc Wird verwendet, um die interaktive Shell-Konfiguration einzustellen und Befehle für alle Benutzer auszuführen, wird beim Start als interaktive Shell gelesen.
  • $ZDOTDIR/.zshrc Wird verwendet, um die interaktive Shell-Konfiguration für den Benutzer einzustellen und Befehle auszuführen, wird beim Start als interaktive Shell gelesen.
  • /etc/zsh/zlogin Wird zum Ausführen von Befehlen für alle Benutzer am Ende des Anfangsfortschritts verwendet, wird beim Start als Login-Shell gelesen.
  • $ZDOTDIR/.zlogin Wird zum Ausführen von Benutzerbefehlen am Ende des Anfangsfortschritts verwendet, wird beim Start als Login-Shell gelesen. Wird typischerweise für den automatischen Start von Kommandozeilenprogrammen verwendet. Sollte nicht zum Autostart von grafischen Sitzungen verwendet werden, da die Sitzung zu diesem Zeitpunkt möglicherweise Konfigurationen enthält, die nur für eine interaktive Shell bestimmt sind.
  • $ZDOTDIR/.zlogout Wird für die Ausführung von Befehlen verwendet, wenn eine Login-Shell beendet wird.
  • /etc/zsh/zlogout Wird für die Ausführung von Befehlen für alle Benutzer verwendet, wenn eine Login-Shell beendet wird.

Siehe grafische Darstellung.

Hinweis:

  • $HOME/.profile ist nicht Teil der Zsh-Startdateien und wird von Zsh nicht aufgerufen, es sei denn, Zsh wird als sh oder ksh aufgerufen und als Login-Shell gestartet. Für weitere Details über die Kompatibilitätsmodi von sh und ksh siehe zsh(1) § COMPATIBILITY.
  • Die Pfade, die in Arch’s zsh-Paket verwendet werden, unterscheiden sich von den Standardpfaden, die in den Man Pages (FS#48992) verwendet werden.
Warnung: Entfernen Sie nicht die Standardzeile in /etc/zsh/zprofile, da sonst die Integrität anderer Pakete, die einige Skripte in /etc/profile.d/ zur Verfügung stellen, beeinträchtigt wird.

Zsh konfigurieren

Obwohl Zsh von Haus aus benutzbar ist, ist es mit Sicherheit nicht so eingerichtet, wie die meisten Benutzer es gerne verwenden würden. Aber aufgrund der schieren Menge an Anpassungen, die in Zsh verfügbar sind, kann die Konfiguration von Zsh eine entmutigende und zeitraubende Erfahrung sein.

Einfache .zshrc

Unten ist eine Beispielkonfigurationsdatei enthalten. Sie bietet einen anständigen Satz von Standardoptionen und gibt Beispiele für viele Möglichkeiten, wie Zsh angepasst werden kann. Um diese Konfiguration zu verwenden, speichern Sie sie als Datei mit dem Namen .zshrc.

Tipp: Wenden Sie die Änderungen an, ohne sich ab- und wieder anzumelden, indem Sie source ~/.zshrc.

Hier ist eine einfache .zshrc:

~/.zshrc
autoload -Uz compinit promptinitcompinitpromptinit# Dies setzt die Standard-Eingabeaufforderung auf das Thema waltersprompt walters

Siehe #Eingabeaufforderungs-Themen für weitere Details über das Eingabeaufforderungs-Themensystem.

$PATH konfigurieren

Zsh bindet die PATH Variable an ein path Array. Sie werden automatisch synchronisiert. Dies ermöglicht es uns, PATH durch einfaches Ändern des Arrays zu manipulieren. Siehe A User’s Guide to the Z-Shell für Details.

Die Zeile typeset -U PATH path, in der -U für unique steht, weist die Shell an, Duplikate von $PATH und $path zu verwerfen:

~/.zshenv
typeset -U PATH pathpath=("$HOME/.local/bin" /other/things/in/path "$path")export PATH

Befehlsvervollständigung

Das vielleicht überzeugendste Merkmal von Zsh sind seine fortgeschrittenen Fähigkeiten zur automatischen Vervollständigung. Aktivieren Sie zumindest die automatische Vervollständigung in .zshrc. Um die Autovervollständigung zu aktivieren, fügen Sie Folgendes zu Ihrer ~/.zshrc:

~/.zshrc
autoload -Uz compinitcompinit

Die obige Konfiguration beinhaltet die Vervollständigung von ssh/scp/sftp-Hostnamen, aber damit diese Funktion funktioniert, dürfen Benutzer das Hostnamen-Hashing von ssh nicht aktivieren (d. h. Option HashKnownHosts in HashKnownHosts).

Für die automatische Vervollständigung mit einer pfeiltastengesteuerten Schnittstelle fügen Sie Folgendes hinzu:

~/.zshrc
zstyle ':completion:*' menu select

Um das Menü zu aktivieren, drücken Sie zweimal Tab.

Für die automatische Vervollständigung von Befehlszeilenschaltern für Aliase fügen Sie folgendes hinzu:

~/.zshrc
setopt COMPLETE_ALIASES

Für die Aktivierung der automatischen Vervollständigung von privilegierten Umgebungen in privilegierten Befehlen (z.z. B. wenn Sie einen Befehl, der mit sudo beginnt, vervollständigen, werden die Vervollständigungsskripte auch versuchen, Ihre Vervollständigungen mit sudo zu ermitteln), include:

~/.zshrc
zstyle ':completion::complete:*' gain-privileges 1
Warnung: Dies lässt Zsh-Vervollständigungsskripte Befehle mit sudo-Rechten ausführen. Sie sollten dies nicht aktivieren, wenn Sie nicht vertrauenswürdige Autovervollständigungsskripte verwenden.
Hinweis: Diese spezielle Art der kontextabhängigen Vervollständigung ist nur für eine kleine Anzahl von Befehlen verfügbar.

Schlüsselverknüpfungen

Zsh benutzt nicht readline, sondern seinen eigenen und leistungsfähigeren Zsh Line Editor (ZLE). Es liest nicht /etc/inputrc oder ~/.inputrc. Lesen Sie Einen genaueren Blick auf den Zsh-Zeileneditor und das Erstellen eigener Widgets für eine Einführung in die ZLE-Konfiguration.

ZLE hat einen Emacs-Modus und einen vi-Modus. Wenn eine der VISUAL– oder EDITOR-Umgebungsvariablen die Zeichenkette vi enthält, wird der vi-Modus verwendet; andernfalls wird standardmäßig der Emacs-Modus verwendet. Setzen Sie den Modus explizit mit bindkey -e oder bindkey -v für den Emacs-Modus bzw. den vi-Modus.

Tastenbelegungen werden zugewiesen, indem eine Escape-Sequenz, die einem Tastendruck entspricht, einem ZLE-Widget zugeordnet wird. Die verfügbaren Widgets, mit Beschreibungen ihrer Aktionen und ihrer Standard-Tastenbindungen, sind in zshzle(1) § STANDARD WIDGETS und zshcontrib(1) § ZLE FUNCTIONS aufgelistet.

Der empfohlene Weg, Tastenbindungen in Zsh zu setzen, ist die Verwendung von String-Capabilities aus terminfo(5). Zum Beispiel:

~/.zshrc
# einen zkbd-kompatiblen Hash erstellen;# um andere Schlüssel zu diesem Hash hinzuzufügen, siehe: man 5 terminfotypeset -g -A keykey="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"# Schlüssel entsprechend einstellen}" ]] && bindkey -- "${key}" beginning-of-line}" ]] && bindkey -- "${key}" Zeilenende}" ]] && bindkey -- "${key}" overwrite-mode}" ]] && bindkey -- "${key}" Rückwärts-Lösch-Zeichen}" ]] && bindkey -- "${key}" delete-char}" ]] && bindkey -- "${key}" up-line-or-history}" ]] && bindkey -- "${key}" down-line-or-history}" ]] && bindkey -- "${key}" backward-char}" ]] && bindkey -- "${key}" vorwärts-Zeichen}" ]] && bindkey -- "${key}" beginning-of-buffer-or-history}" ]] && bindkey -- "${key}" end-of-buffer-or-history}" ]] && bindkey -- "${key}" reverse-menu-complete# Abschließend muss sichergestellt werden, dass sich das Terminal im Anwendungsmodus befindet, wenn zle# aktiv ist. Nur dann sind die Werte aus $terminfo gültig.if (( ${+terminfo} && ${+terminfo} )); thenautoload -Uz add-zle-hook-widgetfunction zle_application_mode_start { echoti smkx }function zle_application_mode_stop { echoti rmkx }add-zle-hook-widget -Uz zle-line-init zle_application_mode_startadd-zle-hook-widget -Uz zle-line-finish zle_application_mode_stopfi

History search

Sie müssen das key-Array einrichten und sicherstellen, dass ZLE in den Anwendungsmodus geht, um die folgenden Anweisungen zu verwenden; siehe #Tastenbelegung.

Um die Verlaufssuche zu aktivieren, fügen Sie diese Zeilen zur .zshrc Datei hinzu:

~/.zshrc
autoload -Uz up-line-or-beginning-search down-line-or-beginning-searchzle -N up-line-or-beginning-searchzle -N down-line-or-beginning-search}" ]] && bindkey -- "${key}" up-line-or-beginning-search}" ]] && bindkey -- "${key}" down-line-or-beginning-search

Damit werden nur die vergangenen Befehle, die zur aktuellen Zeile bis zur aktuellen Cursorposition passen, angezeigt, wenn Up oder Down Tasten gedrückt werden.

Shift, Alt, Ctrl und Meta Modifier

xterm-kompatible Terminals können erweiterte Tastendefinitionen von user_caps(5) verwenden. Dies sind Kombinationen von Shift, Alt, Ctrl und Meta zusammen mit Up, Down, Left, Right, PageUp, PageDown, Home, End oder Del. Eine Liste der empfohlenen Namen für die Modifikatortasten und Tastenkombinationen finden Sie in der zkbd-Quelle.

Zum Beispiel für Ctrl+Left, um zum Anfang des vorherigen Wortes und Ctrl+Right, um zum Anfang des nächsten Wortes zu springen:

~/.zshrc
key="${terminfo}"key="${terminfo}"}" ]] && bindkey -- "${key}" backward-word}" ]] && bindkey -- "${key}" forward-word

Prompts

Zsh bietet die Möglichkeit, ein Prompt-Theme zu verwenden oder, für Benutzer, die mit den Themes unzufrieden sind (oder deren Nützlichkeit erweitern wollen), die Möglichkeit, einen eigenen Prompt zu erstellen.

Prompt-Themes

Prompt-Themes sind ein schneller und einfacher Weg, einen farbigen Prompt in Zsh einzurichten. Siehe zshcontrib(1) § PROMPT THEMES für Informationen über Prompt-Themen und wie Sie Ihr eigenes Thema schreiben können.

Um ein Thema zu verwenden, stellen Sie sicher, dass das Prompt-Thema-System in .zshrc auf autoload gesetzt ist. Dies kann durch Hinzufügen dieser Zeilen zu:

~/.zshrc
autoload -Uz promptinitpromptinit

Verfügbare Prompt-Themen werden durch Ausführen des Befehls aufgelistet:

$ prompt -l

Um beispielsweise das Thema walters zu verwenden, geben Sie ein:

$ prompt walters

Um eine Vorschau aller verfügbaren Themen zu erhalten, verwenden Sie diesen Befehl:

$ prompt -p
Manuelle Installation von Prompt-Themen

Es ist möglich, Themen manuell zu installieren, ohne externe Konfigurationsmanager-Tools. Für eine lokale Installation erstellen Sie zunächst einen Ordner und fügen ihn dem fpath-Array hinzu, z.B.:

$ mkdir ~/.zprompts$ fpath=("$HOME/.zprompts" "$fpath")

Erstellen Sie nun einen symbolischen Link Ihrer Theme-Datei in diesem Ordner:

$ ln -s mytheme.zsh ~/.zprompts/prompt_mytheme_setup

Wenn Sie stattdessen ein Theme global installieren wollen, machen Sie:

# ln -s mytheme.zsh /usr/share/zsh/functions/Prompts/prompt_mytheme_setup

Jetzt sollten Sie es aktivieren können mit:

$ prompt mytheme

Wenn alles funktioniert, können Sie Ihr .zshrc entsprechend bearbeiten.

Hinzufügen von Prompt-Themen ohne eigene Datei

Zusätzlich zum Hinzufügen eines Prompt-Themas über eine eigene Datei ist es möglich, Themen aus einer anderen Datei (wie Ihrer .zshrc) hinzuzufügen, z.B.:

~/.zshrc
# Lade promptinitautoload -.Uz promptinit && promptinit# Definieren Sie das themeprompt_mytheme_setup() { PS1="%~%#"}# Fügen Sie das theme zu promptsysprompt_themes+=( mytheme )# Laden Sie das themeprompt mytheme

Angepasster Prompt

Tango-view-fullscreen.pngDieser Artikel oder Abschnitt muss erweitert werden.Tango-view-fullscreen.png

Grund: Füge ein einfaches farbloses PROMPT Beispiel hinzu. (Diskutiere in Talk:Zsh#)

Zusätzlich zu einem primären linksseitigen Prompt PS1 (PROMPT, prompt), der allen Shells gemeinsam ist, unterstützt Zsh auch einen rechtsseitigen Prompt RPS1 (RPROMPT). Diese beiden Variablen sind diejenigen, die Sie auf einen eigenen Wert setzen wollen.

Andere spezielle Prompts, wie PS2 (PROMPT2), PS3 (PROMPT3), PS4 (PROMPT4), RPS1 (RPROMPT), RPS2 (RPROMPT2) und SPROMPT, werden in zshparam(1) § PARAMETER, DIE VON DER SHELL VERWENDET WERDEN, erklärt.

Alle Prompts können mit Prompt Escapes angepasst werden. Die verfügbaren Prompt-Escapes sind in zshmisc(1) § ERWEITERUNG DER PROMPT-SEQUENZEN aufgelistet.

Farben

Zsh setzt Farben anders als Bash, Sie müssen keine komplizierten ANSI-Escape-Sequenzen oder Terminal-Fähigkeiten aus terminfo(5) verwenden. Zsh bietet bequeme Prompt-Escapes, um die Vordergrundfarbe, die Hintergrundfarbe und andere visuelle Effekte zu setzen; siehe zshmisc(1) § Visuelle Effekte für eine Liste von ihnen und ihre Beschreibungen.

Farben können mit einer dezimalen Ganzzahl, dem Namen einer der acht am meisten unterstützten Farben oder als # gefolgt von einem RGB-Triplet im Hexadezimalformat angegeben werden. Siehe die Beschreibung von fg=colour in zshzle(1) § CHARACTER HIGHLIGHTING für weitere Details.

Die meisten Terminals unterstützen die folgenden Farben mit Namen:

Name Nummer
black 0
red 1
green 2
yellow 3
blue 4
magenta 5
cyan 6
white 7

Die Farbnummern 0-255 für Terminalemulatoren, die mit xterm 256 Farben kompatibel sind, finden Sie in der xterm-256-Farben-Tabelle.

Bei einer korrekt gesetzten TERM-Umgebungsvariable kann die vom Terminal unterstützte maximale Anzahl von Farben aus der terminfo(5)-Datenbank mit echoti colors ermittelt werden. Bei 24-Bit-Farben überprüfen Sie auch die Umgebungsvariable COLORTERM mit print $COLORTERM. Wenn sie 24bit oder truecolor zurückgibt, unterstützt Ihr Terminal 16777216 (224) Farben, auch wenn terminfo eine kleinere Zahl anzeigt.

Hinweis:

  • Die Farben 0-15 können sich zwischen Terminalemulatoren und den von ihnen verwendeten Farbschemata unterscheiden.
  • Viele Terminalemulatoren stellen Fettdruck mit einer helleren Farbe dar.
Tipp:

  • Prompt-Escapes können z.B. mit dem Befehl print -P "prompt escapes" getestet werden:
    $ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'
  • Wenn Sie 24-Bit-Farben verwenden, möchten Sie vielleicht das Modul zsh/nearcolor in Terminals laden, die diese nicht unterstützen. Z.B.:
    }" -eq '16777216' ]] || zmodload zsh/nearcolor

    Siehe zshmodules(1) § THE ZSH/NEARCOLOR MODULE für Details über das zsh/nearcolor Modul.

Beispiel

Dies ist ein Beispiel für einen zweiseitigen Prompt:

PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# 'RPROMPT=''

Und so wird er angezeigt:

username@host ~ %

Um Farben aus dem Bereich 16-255 und 24-Bit-Echtfarben zu verwenden, können Sie die Zahl von 0 bis 255, die der gewünschten Farbe zugeordnet ist, bzw. ihren hexadezimalen Farbcode verwenden:

PROMPT='%F{2}%n%f@%F{5}%m%f %F{4}%B%~%b%f %# 'RPROMPT=''
PROMPT='%F{#c0c0c0}%n%f@%F{#008000}%m%f %F{#800080}%B%~%b%f %# 'RPROMPT=''

Beispiel .zshrc-Dateien

  • Um die gleichen Einstellungen wie bei den monatlichen ISO-Versionen zu erhalten (die standardmäßig Zsh verwenden), installieren Sie grml-zsh-config. Es enthält die vielen Verbesserungen und fortgeschrittenen Optimierungen von grml.
  • https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc – Basis-Setup, mit dynamischer Eingabeaufforderung und Fenstertitel/Hardinfo.
  • https://github.com/slashbeast/conf-mgmt/blob/master/roles/home_files/files/DOTzshrc – zshrc mit mehreren Funktionen, beachten Sie die Kommentare dazu. Bemerkenswerte Features: Bestätigungsfunktion, um sicherzustellen, dass der Benutzer Poweroff, Reboot oder Hibernate ausführen möchte, Unterstützung für GIT in der Eingabeaufforderung (ohne vcsinfo), Tab-Vervollständigung mit Menü, Drucken des aktuell ausgeführten Befehls in die Titelleiste des Fensters und mehr.

Siehe dotfiles#User repositories für mehr.

Tipps und Tricks

Autostart von X bei der Anmeldung

Siehe xinit#Autostart von X bei der Anmeldung.

Wiederherstellen der Terminaleinstellungen nach dem abnormalen Beenden eines Programms

Viele Programme ändern den Terminalstatus und stellen die Terminaleinstellungen beim abnormalen Beenden oft nicht wieder her (z.B. wenn sie abstürzen oder auf SIGINT treffen).

Dies kann in der Regel durch Ausführen von reset(1) gelöst werden:

$ reset

Die folgenden Abschnitte beschreiben Möglichkeiten, um das manuelle Zurücksetzen des Terminals zu vermeiden.

Der ttyctl-Befehl

Der ttyctl-Befehl kann verwendet werden, um das Terminal „einzufrieren/aufzutauen“. Um die interaktive Shell beim Start einzufrieren, verwenden Sie folgendes:

~/.zshrc
ttyctl -f

Terminal mit Escape-Sequenzen zurücksetzen

Alternativer Linienzeichensatz kann das Terminal auf eine Weise durcheinanderbringen, die ttyctl nicht verhindern kann.

Eine einfache Lösung besteht darin, die Escape-Sequenzen, die das Terminal zurücksetzen, über die precmd-Hook-Funktion auszugeben, so dass sie jedes Mal ausgeführt werden, bevor der Prompt gezeichnet wird. Verwenden Sie zum Beispiel die Escape-Sequenz \e] && (( ${#dirstack} == 0 )); thendirstack=("${(@f)"$(< "$DIRSTACKFILE")"}")}" ]] && cd -- "${dirstack}"fichpwd_dirstack() {print -l -- "$PWD" "${(u)dirstack}" > "$DIRSTACKFILE"}add-zsh-hook -Uz chpwd chpwd_dirstackDIRSTACKSIZE='20'setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME## Remove duplicate entriessetopt PUSHD_IGNORE_DUPS## This reverts the +/- operators.setopt PUSHD_MINUS

Now use

$ dirs -v

to print the dirstack. Use cd -<NUM>, um zu einem besuchten Ordner zurückzukehren. Verwenden Sie die Autovervollständigung nach dem Bindestrich. Dies erweist sich als sehr praktisch, wenn Sie das Autovervollständigungsmenü verwenden.

Hinweis: Dies funktioniert nicht, wenn Sie mehr als eine zsh-Sitzung geöffnet haben und versuchen, cd, aufgrund eines Konflikts, wenn beide Sitzungen in dieselbe Datei schreiben.

cdr

cdr ermöglicht es Ihnen, das Arbeitsverzeichnis in ein früheres Arbeitsverzeichnis aus einer automatisch geführten Liste zu ändern. Es speichert alle Einträge in Dateien, die sitzungsübergreifend und (standardmäßig) zwischen Terminalemulatoren in der aktuellen Sitzung verwaltet werden.

Siehe zshcontrib(1) § REMEMBERING RECENT DIRECTORIES für Anweisungen zur Einrichtung.

Hilfe-Befehl

Im Gegensatz zur Bash aktiviert Zsh keinen eingebauten help-Befehl, stattdessen bietet es run-help. Standardmäßig ist run-help ein Alias für man, er kann entweder manuell ausgeführt werden, indem er einem Befehl vorangestellt wird, oder er kann für den aktuell eingegebenen Befehl mit den Tastaturkürzeln Alt+h oder Esc h aufgerufen werden.

Da er standardmäßig nur ein Alias für man ist, funktioniert er nur bei externen Befehlen. Um seine Funktionalität zu verbessern, so dass es auf Shell-Buildins und andere Shell-Features funktioniert, müssen Sie die Funktion run-help verwenden. Siehe zshcontrib(1) für weitere Informationen über run-help und seine Assistentenfunktionen.

Laden Sie zuerst die run-help-Funktion und entfernen Sie dann den bestehenden run-help-Alias. Der Einfachheit halber kann help als Alias für run-help verwendet werden. Fügen Sie zum Beispiel folgendes zu Ihrem zshrc hinzu:

autoload -Uz run-help(( ${+aliases} )) && unalias run-helpalias help=run-help

Assistenzfunktionen müssen separat aktiviert werden:

autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn

Zum Beispiel öffnet der Befehl run-help git commit jetzt die Manpage git-commit(1) statt git(1).

Persistent rehash

Typischerweise findet compinit neue ausführbare Dateien nicht automatisch im $PATH. Wenn Sie zum Beispiel ein neues Paket installieren, werden die Dateien in /usr/bin/ nicht sofort oder automatisch in die Vervollständigung aufgenommen. Um diese neuen ausführbaren Dateien einzuschließen, müsste man also Folgendes ausführen:

$ rehash

Dieser "Aufguss" kann automatisch erfolgen. Fügen Sie einfach folgendes in Ihre zshrc ein:

~/.zshrc
zstyle ':completion:*' rehash true

On-demand rehash

Wie oben, jedoch kann pacman mit Hooks konfiguriert werden, um automatisch einen rehash anzufordern, was nicht die Leistungseinbußen des ständigen rehash wie oben mit sich bringt. Um dies zu aktivieren, erstellen Sie das Verzeichnis /etc/pacman.d/hooks und ein Verzeichnis /var/cache/zsh, dann erstellen Sie eine Hook-Datei:

/etc/pacman.d/hooks/zsh.hook
Operation = InstallOperation = UpgradeOperation = RemoveType = PathTarget = usr/bin/*Depends = zshWhen = PostTransactionExec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman

Dies hält das Änderungsdatum der Datei /var/cache/zsh/pacman konsistent mit dem letzten Mal, als ein Paket installiert, aktualisiert oder entfernt wurde. Dann muss zsh dazu gebracht werden, seinen eigenen Befehls-Cache neu zu puffern, wenn er veraltet ist, indem man zu ~/.zshrc:

~/.zshrc
zshcache_time="$(date +%s%N) "autoload -Uz add-zsh-hookrehash_precmd() { if ]; then local paccache_time="$(date -r /var/cache/zsh/pacman +%s%N)" if (( zshcache_time < paccache_time )); then rehash zshcache_time="$paccache_time" fi fi}add-zsh-hook -Uz precmd rehash_precmd

Wenn der precmd-Hook ausgelöst wird, bevor /var/cache/zsh/pacman aktualisiert wird, kann es sein, dass die Beendigung nicht funktioniert, bis eine neue Eingabeaufforderung gestartet wird. Das Ausführen eines leeren Befehls, z.B. durch Drücken von enter, sollte ausreichen.

Alternative on-demand rehash mit SIGUSR1

Wie oben, jedoch sieht die Hook-Datei wie folgt aus:

/etc/pacman.d/hooks/zsh-rehash.hook
Operation = InstallOperation = UpgradeOperation = RemoveType = PathTarget = usr/bin/*Depends = zshDepends = procps-ngWhen = PostTransactionExec = /usr/bin/pkill zsh --signal=USR1
Warning: Dies sendet SIGUSR1 an alle laufenden zsh Instanzen. Beachten Sie, dass das Standardverhalten für SIGUSR1 "terminate" ist. Wenn Sie dies zum ersten Mal konfigurieren, werden alle laufenden zsh-Instanzen aller Benutzer (einschließlich der Login-Shells) beendet, wenn sie den unten stehenden Trap nicht erhalten haben.
~/.zshrc
TRAPUSR1() { rehash }

Der obige Funktionstrap kann durch einen Listtrap trap 'rehash' USR1 ersetzt werden. Siehe zshmisc(1) § Trap-Funktionen für die Unterschiede zwischen den Arten von Traps.

Diese Methode wird sofort rehash alle zsh Instanzen auslösen, wodurch die Notwendigkeit entfällt, die Eingabetaste zu drücken, um precmd auszulösen.

Taste an ncurses-Anwendung binden

Eine ncurses-Anwendung an einen Tastendruck binden, aber sie wird keine Interaktion akzeptieren. Verwenden Sie die Variable BUFFER, damit es funktioniert. Das folgende Beispiel lässt Benutzer ncmpcpp mit Alt+\ öffnen:

~/.zshrc
ncmpcppShow() { BUFFER="ncmpcpp" zle accept-line}zle -N ncmpcppShowbindkey '^2;

\a. Zum Beispiel:

$ print -n '\e]2;My xterm title\a'

setzt den Titel auf

My xterm title

Eine einfache Möglichkeit, einen dynamischen Titel zu haben, ist, den Titel in den Hook-Funktionen precmd und preexec zu setzen. Siehe zshmisc(1) § Hook-Funktionen für eine Liste der verfügbaren Hook-Funktionen und deren Beschreibungen.

Durch die Verwendung von print -P können Sie zusätzlich die Vorteile der Prompt-Escapes von Zsh nutzen.

Tipp:

  • Der Ausdruck des Titels kann in mehrere Befehle aufgeteilt werden, solange sie aufeinander folgen.
  • GNU Screen sendet den xterm-Titel an den Hardstatus (%h). Wenn Sie die String-Escapes von Screen verwenden wollen (z.B. für Farben), sollten Sie den hardstatus mit der Escape-Sequenz \e_\e\ setzen. Andernfalls, wenn String-Escapes in \e]2;\a verwendet werden, erhält der Terminalemulator einen verstümmelten Titel, da er nicht in der Lage ist, die String-Escapes von Screen zu interpretieren.
Hinweis:

  • Verwenden Sie die Option -P von print nicht, wenn Sie Variablen ausgeben, um zu verhindern, dass sie als Prompt-Escapes geparst werden.
  • Verwenden Sie das q-Parametererweiterungsflag beim Drucken von Variablen, um zu verhindern, dass sie als Escape-Sequenzen geparst werden.
~/.zshrc
autoload -Uz add-zsh-hookfunction xterm_title_precmd () {print -Pn -- '\e]2;%n@%m %~\a'] && print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-}\e\\'}function xterm_title_preexec () {print -Pn -- '\e]2;%n@%m %~ %# ' && print -n -- "${(q)1}\a"] && { print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-} %# ' && print -n -- "${(q)1}\e\"; }}if ]; thenadd-zsh-hook -Uz precmd xterm_title_precmdadd-zsh-hook -Uz preexec xterm_title_preexecfi

Terminalemulator-Tabulator-Titel

Einige Terminalemulatoren und Multiplexer unterstützen das Setzen des Titels des Tabs. Die Escape-Sequenzen hängen vom Terminal ab:

Terminal Escape-Sequenzen Beschreibung
GNU Screen \ek\e\ Fenstertitel des Screens (%t).
Konsole \e]30;\a Registerkartentitel der Konsole.

Shell-Umgebungserkennung

Siehe ein Repository über Shell-Umgebungserkennung für Tests zur Erkennung der Shell-Umgebung. Dazu gehören Login/interaktive Shell, Xorg-Sitzung, TTY und SSH-Sitzung.

/dev/tcp-Äquivalent: ztcp

Verwenden Sie das Modul zsh/net/tcp:

$ zmodload zsh/net/tcp

Sie können jetzt TCP-Verbindungen aufbauen:

$ ztcp example.com 80

Shortcut zum Beenden der Shell bei teilweiser Kommandozeile

Standardmäßig schließt Ctrl+d die Shell nicht, wenn die Kommandozeile gefüllt ist, dies behebt es:

.zshrc

exit_zsh() { exit }zle -N exit_zshbindkey '^D' exit_zsh

Erweiterungen von Drittanbietern

Konfigurations-Frameworks

Hinweis: Frameworks führen eine Abstraktionsebene und Komplexität ein. Sie können ein undefiniertes Verhalten einführen und tun dies auch oft. Im Falle eines Shell-Breaks sollte der erste Debugging-Schritt darin bestehen, zur normalen Shell zurückzukehren.
  • oh-my-zsh – Ein beliebtes, von der Community betriebenes Framework zur Verwaltung der Zsh-Konfiguration. Es kommt gebündelt mit einer Menge hilfreicher Funktionen, Helfer, Plugins, Themen.

https://github.com/ohmyzsh/ohmyzsh || oh-my-zsh-gitAUR

  • Prezto – Ein Konfigurations-Framework für Zsh. Es kommt mit Modulen und bereichert die Kommandozeilenumgebung mit vernünftigen Standardwerten, Aliases, Funktionen, Autovervollständigung und Prompt-Themen.

https://github.com/sorin-ionescu/prezto || prezto-gitAUR

  • ZIM – Ein Konfigurations-Framework mit rasanter Geschwindigkeit und modularen Erweiterungen. Zim ist sehr einfach anzupassen und kommt mit einem reichhaltigen Satz an Modulen und Funktionen, ohne Kompromisse bei Geschwindigkeit oder Funktionalität einzugehen.

https://github.com/zimfw/zimfw || zsh-zim-gitAUR

Plugin-Manager

  • Antibody – Ein leistungsorientierter Plugin-Manager ähnlich wie Antigen.

https://github.com/getantibody/antibody || antibodyAUR

  • zinit (früher „zplugin“) – Flexibler Zsh-Plugin-Manager mit sauberem fpath, Berichten, Abschlussverwaltung, Turbomodus

https://github.com/zdharma/zinit || zsh-zplugin-gitAUR

  • Antigen – Ein Plugin-Manager für Zsh, inspiriert von oh-my-zsh und vundle. ABANDONED

https://github.com/zsh-users/antigen || antigen-gitAUR

  • zgen – Ein leichter und einfacher Plugin-Manager für Zsh. ABANDONED

https://github.com/tarjoilija/zgen || zgen-gitAUR

  • zplug – Ein Plugin-Manager der nächsten Generation für Zsh. ABANDONED

https://github.com/zplug/zplug || zplugAUR

Fish-ähnliche Syntaxhervorhebung und Autosuggestions

Fish bietet sehr mächtige Shell-Syntaxhervorhebung und Autosuggestions. Um beides in Zsh zu nutzen, können Sie zsh-syntax-highlighting und zsh-autosuggestions installieren und schließlich eines oder beide der bereitgestellten Skripte aus Ihrer zshrc herausquellen:

source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zshsource /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

Der „command not found“-Handler

Tango-go-next.pngDieser Artikel oder Abschnitt ist ein Kandidat für die Verschiebung nach #Tipps und Tricks.Tango-go-next.png

Hinweise: Die benutzerdefinierte Funktion, die pacman -F verwendet, ist keine „Drittanbieter-Erweiterung“. Nur pkgfile-Zeug gehört in diesen Abschnitt. (Diskutieren Sie in Talk:Zsh#)

pacman -F „command not found“ handler

pacman enthält eine Funktion, um nach Paketen zu suchen, die eine Datei enthalten. Der folgende „command-not-found“-Handler verwendet pacman direkt, um nach passenden Paketen zu suchen, wenn ein unbekannter Befehl ausgeführt wird.

~/.zshrc
command_not_found_handler() {local pkgs cmd="$1" files=()printf 'zsh: command not found: %s' "$cmd" # Befehl nicht gefunden, dann nach Paketen suchenfiles=(${(f)"$(pacman -F --machinereadable -- "/usr/bin/${cmd}")"})if (( ${#files} )); thenprintf '\r%s kann in den folgenden Paketen gefunden werden:\n' "$cmd "local res=() repo package version filefor file in "$files"; dores=("${(0)file}")repo="$res "package="$res "version="$res "file="$res "printf ' %s/%s %s: /%s\n' "$repo" "$package" "$version" "$file "doneelseprintf '\n'fireturn 127}
Hinweis: Die Dateidatenbank von pacman ist von der normalen Sync-Datenbank getrennt und muss mit pacman -Fy geholt werden. Siehe pacman#Suche nach einem Paket, das eine bestimmte Datei enthält, für Details.

pkgfile „command not found“ handler

pkgfile enthält eine Zsh-Skriptdatei, die eine command_not_found_handler Funktion bereitstellt, die automatisch die pkgfile-Datenbank durchsucht, wenn ein nicht erkannter Befehl eingegeben wird.

Sie müssen das Skript als Quelle angeben, um es zu aktivieren. Zum Beispiel:

~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
Hinweis: Die pkgfile-Datenbank muss möglicherweise aktualisiert werden, bevor dies funktioniert. Siehe pkgfile#Installation für Details.

Deinstallation

Ändern Sie die Standardshell, bevor Sie das zsh-Paket entfernen.

Warnung: Die Nichtbeachtung der folgenden Prozedur kann dazu führen, dass Benutzer keinen Zugriff mehr auf eine funktionierende Shell haben.

Führen Sie den folgenden Befehl aus:

$ chsh -s /bin/bash user

Verwenden Sie ihn für jeden Benutzer, der zsh als Anmeldeshell eingestellt hat (einschließlich root, falls erforderlich). Wenn dies abgeschlossen ist, kann das zsh-Paket entfernt werden.

Alternativ können Sie die Standard-Shell wieder auf Bash zurücksetzen, indem Sie /etc/passwd als root bearbeiten.

Warnung: Es wird dringend empfohlen, vipw(8) beim Editieren von /etc/passwd zu verwenden, da es hilft, ungültige Einträge und/oder Syntaxfehler zu vermeiden.

Ändern Sie zum Beispiel folgendes:

username:x:1000:1000:Full Name,,,:/home/username:/usr/bin/zsh

Dazu:

username:x:1000:1000:Full Name,,,:/home/username:/bin/bash

Siehe auch

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.