Hauptseite

Die Z-Shell (zsh) – Eine mächtige Alternative zur Bash

1. Februar 2010 von

Die Standardshell auf den meisten Linux-Systemen ist die Bash. Sie ist schon sehr mächtig und erlaubt es viele Aufgaben zu automatisieren. Dieser Artikel soll sich einer sehr interessanten weil noch mächtigeren Shell widmen, der Z-Shell kurz zsh.

Die zsh lässt sich auf quasi allen Linuxsystemen über die Paketverwaltung installieren. Unter Ubuntu z.B. mit dem Befehl

sudo apt-get install zsh

Danach kann man sie mit dem Aufruf von zsh ausführen. Um sie zur Standardshell zu machen genügt der Befehl

chsh -s /usr/bin/zsh username

Wobei username durch den entsprechenden Usernamen ersetzt werden muss und der Pfad zu zsh stimmen muss. Auf manchen Systemen liegt zsh in /bin. Wo zsh liegt kann man mit dem folgenden Befehl heraus finden:

which zsh

Die zsh bedient sich Elementen der Bash, der Korn-Shell (ksh) und der TENEX-C-Shell (tcsh – eine erweiterte C-Shell). Sie ist sehr gut konfigurierbar und fast jedes Verhalten der Bash kann nachgeahmt werden so dass der Umstieg sehr leicht fällt. Bestehende Bash-Scripte können natürlich weiterhin genutzt werden, wenn der Shebang entsprechend gesetzt ist. Also in der ersten Zeile folgendes steht:

#!/bin/bash

Im Folgenden werde ich einige interessante Vorteile der zsh kurz beschreiben. Zu einzelnen Themen werde wahrscheinlich in anderen Artikel ausführlicher eingehen. Dies sollen also nur Beispiele sein, die die Mächtigkeit demonstrieren sollen. Da die zsh so viele Möglichkeiten bietet ist es nicht möglich hier alles im Detail zu erläutern. Optionen werden mit dem Befehl setopt gesetzt. Dies kann man auch so in die Konfigurationsdatei ~/.zshrc schreiben.

Autokorrektur
Die zsh beherrscht einen Mechanismus, der kleine Tippfehler automatisch korrigiert. Hat man in einem Ordner eine Datei testfile.txt und möchte diese kopieren nach file2.txt, so führt man in der Regel folgenden Befehl aus:

cp testfile.txt file2.txt

wie von der Bash gewohnt nutzt man dafür die Autovervollständigung mittels TAB. Bei einem Verschreiber wird dieser in der zsh automatisch korrigiert. Beispiel:

cp tsetf<TAB>

wird automatisch korrigiert und zu

cp testfile.txt

vervollständigt.

Die Autokorrektur aktiviert man mit der Option correct

Globale Aliase
Neben den normalen Aliasen für Kommandos, wie man sie aus der Bash kennt, gibt es in der zsh noch globale Aliase, die überall im Befehl genutzt werden können, nicht nur am Anfang. Zwei Beispiele verdeutlichen dies:

alias -g G='| grep'
alias -g L='| less'

erzeugt die globalen Aliase G und L die man hinter alle möglichen Befehle schreiben kann um die Ausgabe des entsprechenden Befehls in grep oder less zu pipen. Z.B.

ls G txt

entspricht dem Befehl

ls | grep txt

oder

ps -e L

entspricht

ps -e | less

Natürlich ist auch folgendes Möglich:

ls G txt L

was folgendem Befehl entspricht:

ls | grep txt | less

Suffix Aliase
Mit Suffixaliasen kann man Programme festlegen, mit denen bestimmte Dateitypen (anhand ihrer Endung) geöffnet werden sollen. Man braucht dann nur noch den Namen der Datei eingeben und sie wird mit dem entsprechenden Programm geöffnet. Beispiel:

alias -s pdf=evince

legt einen Alias für pdf Dateien an. Sie sollen mit evince geöffnet werden. Danach reicht die Eingabe von

dokument.pdf

und die Datei dokument.pdf wird mit evince geöffnet.

Aliase für Verzeichnisse: Hashes
Mit sogenannten Hashes lassen sich Aliase für beliebige Verzeichnisse anlegen. Auf diese kann dann sehr einfach zugegriffen werden. Mit dem Befehl

hash -d perl=~/developement/scripting/perl

legt man einen Hash namens perl für das Verzeichnis ~/developement/scripting/perl an. Auf dieses Verzeichnis kann man jetzt mit ~perl zugreifen. Auch innerhalb eines Befehls wie folgendes Beispiel zeigt:

cp testscript.pl ~perl

Dieser Befehl kopiert die Datei testscript.pl in das Verzeichnis ~/developement/scripting/perl.

Auto-CD
Mit der Option autocd kann man zum Wechseln in ein Verzeichnis einfach den Namen eines Verzeichnisses eingeben und das Kommando cd davor einfach weglassen. Wenn es keinen Befehl gibt, der so heißt wie das Verzeichnis, so wird in das Verzeichnis gewechselt.

Kurze for-Schleifen
Statt einem

for i in *.eps; do epstopdf $i; done

um alle eps-Dateien in einem Verzeichnis in pdf-Dateien umzuwandeln genügt unter zsh die kürzere Form

for i (*.eps) epstopdf $i

Globale History
Die History, die man mit der Pfeil-auf Taste durchgehen kann, kann man in der zsh so einstellen, dass sie in jeder zsh-Instanz gleich ist. Das heißt man hat nicht mehr für jedes Fenster seine eigene History sondern kann mit der Pfeil-auf Taste auch Befehle raussuchen, die in anderen Fenstern eingegeben wurden. Die History wird jedoch nur nach jedem Befehl geupdated, das heißt man muss ggf. einmal Return drücken, damit die Befehle aus einem anderen Fenster verfügbar sind.

Dieses Verhalten kann mit der Option share_history aktiviert werden.

Directory Stack
Wie Bash, hat die zsh auch einen Directory stack. Mit dem Befehl pushd kann man das aktuelle Verzeichnis auf den Stack legen und mit popd das jeweils letzte Verzeichnis vom Stack nehmen und dorthin springen. Mit der Option auto_pushd legt die zsh automatisch jedes Verzeichnis auf den Directorystack, aus welchem man in ein anderes Verzeichnis wechselt. So hat man immer eine History der Verzeichnisse in denen man war und kann mit popd sehr einfach wieder in Verzeichnisse welchseln, die man vorher besucht hatte.

Globbing
Die Nutzung von Wildcards – unter zsh globbing genannt – ist bei der Z-Shell wesentlich mächtiger als in der Bash. Zunächst gibt es rekursives Globbing (gibts in der Bash in neueren Versionen wohl auch). So kann man mit dem Befehl

ls **/*.html

alle HTML-Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen auflisten lassen.

Es gibt jedoch auch noch Qualifier um Dateien mit bestimmten Eigenschaften auszuwählen. Diese schreibt man in runde Klammern. So kann man mit . normale Dateien, mit / Verzeichnisse und mit @ Symbolische Links matchen. Praktisch ist das z.B. wenn man allen Verzeichnissen ab einem bestimmten Verzeichnis die Rechte 755 und allen Dateien 644 vergeben möchte. Dies kann man mit den folgenden zwei Befehlen bewerkstelligen statt mit find und exec zu arbeiten.

chmod 755 **/*(/)
chmod 644 **/*(.)

Zusätzlich gibt es auch Qualifier für verschiedenste Dateirechte. Folgender Befehl listet alle Dateien auf, die von allen beschrieben werden können:

ls **/*(.W)

Auch nach der Dateigröße lässt sich suchen:

print **/*(L0)

listet alle leeren Dateien auf.

Auch die Sortierung lässt sich beliebig anpassen. Mit dem Befehl:

print *(oL)

Listet alle Dateien der Größe nach von klein nach groß auf. Mit großem O wird die Sortierung umgekehrt.

Somit lässt sich mittels globbing in der zsh das Kommando find quasi komplett ersetzen. Die hier gezeigten Beispiele sehen auf den ersten Blick recht kompliziert und kryptisch aus. Wenn man das Prinzip aber einmal verstanden hat und die wichtigsten Qualifier kennt ist es aber ganz einfach und sehr praktisch.

Es gibt noch jede Menge weiterer Qualifier und Möglichkeiten für das Globbing (z.B. nur das erste oder eine bestimmte Anzahl von Elementen auszuwählen), die ich hier gar nicht alle erwähnen kann. Im zsh-Manual gibt es jedoch eine Liste der Glob-Qualifier.

Um alle Möglichkeiten nutzen zu können sollte die Option extended_glob gesetzt werden.

Vervollständigung
Die zsh hat wie die Bash einen Vervollständigungsmechanismus, so dass man mit der TAB-Taste Kommandos, Dateinamen und vieles mehr vervollständigen kann. In der zsh ist dieser Mechanismus jedoch extrem gut konfigurierbar und programierbar. So kann man z.B. beim scp Befehl (der Dateien über ssh kopiert) die Verzeichnisse auf dem entfernten Rechner vervollständigen und genau definieren welche Programme mit welchen Dateitypen zusammen arbeiten können. Für sehr viele Programme ist dies schon vorgefertigt, so dass ein

latex doku<TAB>

automatisch zu

 latex dokument.tex

vervollständigt wird. Dies beherrscht die Bash zum Teil auch. Jedoch ist es in der zsh wesentlich besser konfigurierbar und anpassbar.

Sehr praktisch finde ich auch die Menüfunktion. So wird beim ersten Druck auf die TAB-Taste wie in der Bash soweit vervollständigt, bis nicht mehr entschieden werden kann welche Datei (bzw. welcher Befehl) gemeint ist. Ein weiterer Druck auf die TAB-Taste listet alle weiteren Möglichkeiten auf und jeder weitere Druck geht diese Möglichkeiten durch. Wenn ich also drei Dateien habe: test.txt, testfile1.txt und testfile2.txt und gebe folgendes ein:

ls te<TAB>

so wird zuerst auf test vervollständigt. Ein weiterer Druck gibt mir alle Möglichkeiten aus:

testfile1.txt  testfile2.txt  test.txt

und ein dritter Druck auf die Tab-Taste vervollständigt den Befehl zu

ls testfile1.txt

Das ist viel schneller als erst ein f einzugeben um erneut TAB zu drücken und dann die 1 einzugeben um wiederum TAB zu drücken bis der Dateiname endgültig vervollständigt wird.

Ein weiterer Druck auf TAB nimmt dann die nächste Möglichkeit. In diesem Beispiel also

ls testfile2.txt

und so weiter.

Expansion
Mit der TAB-Taste kann man in der zsh nicht nur Kommandos, Dateinamen, … vervollständigen, sondern auch Variablen expandieren. Viele kennen ja die spezielle Variable !!, die den zuletzt ausgeführten Befehl enthält. In der zsh kann man nun folgendes eingeben:

!!<TAB>

und die Variable !! wird automatisch zum zuletzt ausgeführten Befehl expandiert. Genauso kann man auch jede andere Variable expandieren:

$PWD<TAB>

wird zu /home/zimon/developement (vorrausgesetzt ich befinde mich zum Zeitpunkt der expansion in diesem Verzeichnis).

History Kontrolle
Wie bei der Bash auch, kann man in der zsh die History durchsuchen. Die zsh geht jedoch so weit, dass man auch nach bestimmten Parametern suchen kann. Ein Beispiel:

cp ../perl/foo.pl ~/developement/projektordner

Danach kommen ein paar andere Kommandos. Möchte nun eine andere Datei in den gleichen Projektordner kopieren reicht folgende Eingabe:

cp ../perl/bar.pl !?proj?:3

Mit !? wird nach einem vorherigen Befehl gesucht. Das proj ist ein String der in diesem Befehl vorkam. Mit dem ?:3 wird das dritte Argument genutzt. Durch die Expansion kann manmit durch einen Druck auf TAB diesen Ausdruck auch noch expandieren um sicher zu gehen, dass das richtige Argument ausgewählt wurde. Man kann zwar mit Alt+. wie in der Bash die jeweils letzten Argumente durchgehen, auf diese Weise kann man aber auch das zweite von drei Argumenten suchen.

Es gibt noch wesentlich mehr Möglichkeiten die History zu durchsuchen und zu verwenden.

Hochkonfigurierbarer Prompt
In der Z-Shell kann man nicht nur die linke Seite des Prompts sondern auch die rechte Seite konfigurieren. Als Beispiel hier mal mein aktueller Prompt:

zsh Prompt

Mein aktueller zsh-Prompt

Ich finde die Anzeige der Uhrzeit inklusive Sekunden recht praktisch, da man daran sieht wie lange ein Befehl gedauert hat oder wann man ihn ausgeführt hat. Es gibt jedoch auch die Möglichkeit automatisch die Ausgabe von time bei der Beendigung eines Befehls ausgeben zu lassen, der länger als eine vorher definierte Zeit benötigt hat.

Der Prompt ist eine abgeänderte Version von Phil!s ZSH Prompt.

[UPDATE] Auf Anfrage hin ist hier noch der Code für die von mir abgeänderte Version des Prompts:

setprompt () {
    ###
    # Need this so the prompt will work.
 
    setopt prompt_subst
 
 
    ###
    # See if we can use colors.
 
    autoload colors zsh/terminfo
    if [[ "$terminfo[colors]" -ge 8 ]]; then
	colors
    fi
    for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
	eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
	eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
	(( count = $count + 1 ))
    done
    PR_NO_COLOUR="%{$terminfo[sgr0]%}"
 
 
    ###
    # See if we can use extended characters to look nicer.
 
    typeset -A altchar
    set -A altchar ${(s..)terminfo[acsc]}
    PR_SET_CHARSET="%{$terminfo[enacs]%}"
    PR_SHIFT_IN="%{$terminfo[smacs]%}"
    PR_SHIFT_OUT="%{$terminfo[rmacs]%}"
    PR_HBAR=${altchar[q]:--}
    PR_ULCORNER=${altchar[l]:--}
    PR_LLCORNER=${altchar[m]:--}
    PR_LRCORNER=${altchar[j]:--}
    PR_URCORNER=${altchar[k]:--}
 
    if [[ "$TERM" == "screen" ]]; then
	PR_HBAR=-
     	PR_ULCORNER=--
    	PR_LLCORNER=--
    	PR_LRCORNER=--
    	PR_URCORNER=-
   fi 
 
 
    ###
    # Decide if we need to set titlebar text.
 
    case $TERM in
	xterm*)
	    PR_TITLEBAR=$'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\a%}'
	    ;;
	screen)
	    PR_TITLEBAR=$'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'
	    ;;
	*)
	    PR_TITLEBAR=''
	    ;;
    esac
 
 
    ###
    # Decide whether to set a screen title
    if [[ "$TERM" == "screen" ]]; then
        PR_STITLE=$'%{\ekzsh\e\\%}'
    else
        PR_STITLE=''
    fi
 
 
    ###
    # Finally, the prompt.
 
    PROMPT='$PR_SET_CHARSET$PR_STITLE${(e)PR_TITLEBAR}\
$PR_RED$PR_SHIFT_IN$PR_ULCORNER$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
$PR_GREEN%(!.%SROOT%s.%n)$PR_GREEN@%m:%l\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_RED$PR_HBAR${(e)PR_FILLBAR}$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
$PR_MAGENTA%$PR_PWDLEN<...<%~%<<\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_RED$PR_URCORNER$PR_SHIFT_OUT\
 
$PR_RED$PR_SHIFT_IN$PR_LLCORNER$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
%(?..$PR_LIGHT_RED%?$PR_BLUE:)\
${(e)PR_APM}$PR_YELLOW%D{%H:%M:%S}\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_RED$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_NO_COLOUR '
 
    RPROMPT=' $PR_RED$PR_SHIFT_IN$PR_HBAR$PR_BLUE$PR_HBAR$PR_SHIFT_OUT\
($PR_YELLOW%D{%a,%b%d}$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_RED$PR_LRCORNER$PR_SHIFT_OUT$PR_NO_COLOUR'
 
    PS2='$PR_RED$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_BLUE$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT(\
$PR_LIGHT_GREEN%_$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_RED$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT$PR_NO_COLOUR '
 
}
 
setprompt

[/UPDATE]

ZLE-Widgets
Der Z-Line-Editor (ZLE) ist quasi die Eingabezeile in der zsh. Dafür kann man sich kleine Programme schreiben, die einem das Leben vereinfachen. Ein Beispiel wäre ein Programm, dass bei der Eingabe von ... diese zu ../.. umwandelt. Jeder weitere Punkt wird wieder umgewandelt. So kann man recht einfach folgendes eingeben:

cd ..../directory

Auf dem Bildschirm erscheint jedoch folgendes:

cd ../../../directory

Dieses Widget ist kein Standard bei der Z-Shell. Man kann es aber durch folgenden Code in der Konfigurationsdatei ~/.zshrc erzeugen:

rationalise-dot() {
    if [[ $LBUFFER = *.. ]]; then
        LBUFFER+=/..
    else
        LBUFFER+=.
            fi
}
zle -N rationalise-dot
bindkey . rationalise-dot

Automatisches tee-ing
In der Z-Shell kann man die Ausgabe eines Kommandos recht einfach in mehrere verschiedene Dateien umleiten. Statt wie in der Bash

ls | tee -a all | tee actual

zu schreiben, kann man in der zsh einfach

ls >>all >actual

eingeben. Beide Befehle führen ls aus und hängen die Ausgabe an die Datei all an und schreiben sie in die Datei actual wobei der inhalt jeweils überschrieben wird.
Möchte man die Ausgabe wie beim original tee Befehl auch auf dem Bildschirm sehen, so leitet man sie auch noch auf STDOUT um:

ls >>all >actual >&1

Verzeichnisse durch Ersetzung wechseln
Ein Beispiel sollte dies am besten Erklären. Man nehme an man hat zwei Verzeichnisse: ~/developement/scripting/perl/modules und ~/developement/scripting/python/modules und man befindet sich in ~/developement/scripting/perl/modules, so kann man durch den Befehl

cd perl python

in das Verzeichnis ~/developement/scripting/python/modules wechseln. Bei einem cd Kommando mit zwei Parametern wird im aktuellen Verzeichnis-String das erste Wort durch das zweite ersetzt. Hier also perl durch python.

Fazit
Ich bin jetzt nicht 100% sicher, dass alles hier beschriebene nicht auch in der Bash möglich ist. Es zeigt aber auf jeden Fall, dass die Z-Shell jede Menge interessante Möglichkeiten bietet und man viele Dinge einfacher und schneller erledigen kann als in der Bash. Die oben gezeigten Features sind meist nur angerissen und nur eine kleine Auswahl von dem was die Z-Shell bietet. Darüber hinaus besitzt die Z-Shell eine ganze Reihe Module z.B. für Matheoperationen oder einen eigenen FTP-Client, die man bei Bedarf laden kann.

Sehr schön ist auch die Möglichkeit den Screen-Title von der zsh aus zu setzen.

Es lohnt sich auf jeden Fall, diese Shell etwas genauer zu betrachten. Bei mir hat sie mittlerweile die Bash fast vollständig ersetzt (vorhandene Scripte habe ich nicht umgeschrieben).

Links


Schlagworte: , , ,



31 Kommentare zu „Die Z-Shell (zsh) – Eine mächtige Alternative zur Bash“

  1. Moehre sagt:

    Danke für diesen wunderbaren Artikel. Jetzt werde ich zsh wirklich mal testen und nicht nur halbherzig, wie bei meinem ersten Versuch vor einem Jahr. :)

  2. Schumbi sagt:

    Danke. :-) Muss ich bei Gelegenheit direkt mal teste. BTW autocd und die Korrektur gibt es auch in der bash. Da bin ich vor 2 Tagen drauf gestoßen.

    lG
    Schumbi

  3. sharky sagt:

    Für die “faulen” unter uns (wie mich manchmal) gibt es übrigens die zsh, screen und vim konfiguration von grml unter http://michael-prokop.at/blog/2007/12/22/make-console-work-comfortable/
    Ich für meinen Teil bin damit mehr als zufrieden.
    Davon ab: Schön und vor allen Dingen sehr verständlich geschriebener Artikel.
    Viele Seiten die man sonst zur zsh (auf die schnelle) findet, bieten zwar tonnen an infos, aber schmeissen mit Fachbegriffen bzw bezeichnungen um sich, ohne diese auch nur annähernd zu erläutern, was den lesefluss doch manchmal arg stört. Zumindest als zsh Einsteiger.

  4. Cywhale sagt:

    Hallo und vielen Dank für den interessanten Artikel – macht wirklich lust zsh mal zu testen :)

  5. noqqe sagt:

    Klasse Artikel Zimon! Macht wirklich neugierung und wunderbar ausführlich ist er auch noch :)
    *Daumen hoch*
    Werds probieren und sehen was passiert :)

  6. zimon sagt:

    Hallo,

    vielen Dank für die vielen Kommentare. Freut mich, dass der Artikel so großen Anklang findet :)

    @Schumbi: Danke für die Hinweise. Ich wusste nicht, dass die Funktionen auch in der Bash verfügbar sind

    @sharky: erstmal Danke für den Link. Genau das war auch mein Problem mit zsh am Anfang. Es gibt viele Seiten die zsh Tipps auflisten aber man versteht nicht wie sie funktionieren. Ich hab mich dann erstmal durch den User’s Guide und das Manual gewurschtelt um es zu verstehen (vor allem die ganzen globbing Sachen). Über solche Dinge möchte ich in Zukunft auch noch einige Artikel schreiben um sie verständlicher zu machen, aber erstmal wollte ich zsh vorstellen. Leider habe ich im Moment nicht besonders viel Zeit, so dass es etwas dauern kann bis ich dazu komme weitere Artikel zu schreiben.

    Viele Grüße,
    zimon

  7. bas89 sagt:

    Hallo :) Toller Artikel!
    Habe eine Frage: Wenn man mit setopt die Einstellungen setzt, wie speichert man dann bequem das ab, ohne die zshrc anzufassen?

  8. zimon sagt:

    Hallo bas89,

    ganz ohne Anfassen der .zshrc wird es wohl nicht gehen, außer wenn du eine /etc/zshrc anlegst und deine Änderungen lokal in der ~/.zshrc tätigst. Du kannst aber eigene Änderungen in eine andere Datei schreiben und diese in der .zshrc sourcen. Ich bin sogar so weit gegangen, dass meine .zshrc nur aus source-Kommandos besteht, die verschiedene Dateien (für aliase, eigene Funktionen, den Prompt,…) aus einem bestimmten Verzeichnis läd.

    EDIT: Wenn man die .zshrc von grml nutzt, kann man seine Änderungen in die Datei .zshrc.local schreiben (ich gehe mal davon aus, dass diese von der grml .zshrc gesourced wird). Siehe auch: https://wiki.archlinux.de/title/Zsh(grml)#Hinweise_zu_der_GRML_Koniguration

    Viele Grüße,
    zimon

  9. Matthäus sagt:

    Hey, ich bin seit langem begeisterter zsh-Nutzer, bin mir aber sicher, dass ich sie nicht im geringsten ausreize. Dein Artikel hat mich mal wieder bestätigt. Danke schonmal dafür.

    Zwei Beispiele für die Vielfalt an Parametern, die die zsh kennt, was ich sehr an ihr schätze:
    1)
    sudo apt-g->sudo apt-get_-> sudo apt-get i->sudo apt-get install_->sudo apt-get install filez->sudo apt-get install filezilla
    Das letzte Tab dauert zwar etwas, aber die zsh durchsucht mir tatsächlich die Liste der Pakete. Bei remove sogar nur die installierten.
    2)
    du bist in einem Verzeichnis, in dem alle Dateien ausführbar sind, und du hast ein neues Skript ausgelegt, dem du noch die x-Rechte geben musst. (zB /etc/cron.daily)
    sudo chmod +x_->sudo chmod +x NameDerNeuenDatei

    Die zsh “denkt” also viel für einen mit. Viel Spaß noch bei der weiteren Nutzung.

  10. hardy sagt:

    Hallo Matthäus,
    die bash denkt genauso mit bei z.B.: sudo apt-g -> sudo apt-get i -> … eben genau den selben weg den du beschrieben hast ;)

  11. Matthias sagt:

    Hallo, danke für den Artikel, ist wirklich sehr interessant mal eine alternative zur Bash kennenzulernen, bin gerade dabei mir die zsh anzuschauen und muss jetzt schon sagen das die zsh wohl Einzug in meine Linux Kisten halten wird. Könntest du bitte deine angepasste Version von der Prompt noch zur Verfügung stellen? Wäre klasse :)

  12. daniel. sagt:

    Vielen Dank für den Artikel! Wie viele andere hab ich mir schon öfters was über die ZSH durchgelesen, aber bislang konnten mich die eher abstrakten Vorteile nicht überzeugen. Die konkreten Anwendungsbeispiele helfen einem da echt weiter.
    So, jetzt erstmal ein schönes
    $ sudo apt-get install zsh
    und dann mal sehen ;)

  13. Schumbi sagt:

    Hey,
    angestoßen durch Deinen Artikel habe ich etwas in der Manpage der bash (man bash) gewühlt und gelesen. In der Tat kann die Bash auch eine ganze Menge und ich möchte glatt behaupten, dass die von Dir, Zimon, angesprochenen Dinge auch mit der Bash möglich sind. Die Frage ist nur mit welchem Aufwand. :-) Wie das halt immer so ist. Falls da noch jemand hinein schauen will. Sucht nach “shell builtin commands”. Dort steht welche Befehle es gibt mit Verweisen auf die Anwendung. BTW die Manpage hat 5241 Seite :-D (Wer braucht schon Spiele wenn er ne Shell hat ;-) )

    lG
    Schumbi

  14. Schumbi sagt:

    Nachtrag: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Builtins
    Das liest sich besser als eine Manpage und man kann es zur Not auch ausdrucken.

  15. zimon sagt:

    Hallo,

    @Matthias: Habe die abgeänderte Version eingefügt.

    @Schumbi: ich möchte nicht bestreiten, dass die Bash auch eine ganze Reihe von Möglichkeiten bietet. Sie ist wohl nicht umsonst die Standard-Shell auf den meisten Linux-Systemen. Auch dass viele der hier genannten Vorteile der zsh auch mit der Bash möglich sind glaube ich gerne. Jedoch bin ich ziemlich sicher, dass manche Dinge wie globale und suffix Aliase, (Directory) Hashes, Konfiguration der rechten Seite des Prompts sowie eine Entsprechung für ZLE-Widgets in der Bash nicht vorhanden sind und auch nicht nachgebildet werden können (ohne den Bash Quelltext zu ändern). Ich lasse mich jedoch gerne eines besseren belehren :)

    Viele Grüße,
    zimon

  16. Igby sagt:

    Vielleicht für den einen oder anderen hier noch interessant:
    oh-my-zsh, eine Ansammlung von auto-completes, themes und allerlei sontigen Gerümpel, der einem das Leben erleichtern soll. ;)

    http://github.com/robbyrussell/oh-my-zsh

    Gruß
    Igby

  17. RTFM! sagt:

    Aus der virtuellen Nachbarschaft N° 8…

    Suchmaschinenoptimierung – wenn schon, dann richtig Wolff von Rechenberg listet 10 Irrtümer über Suchmaschinenoptimierung auf. Open Source Days in Kopenhagen am 5. und 6.03.2010 Anfang März finden die »Open Source Days«…

  18. cLinx sagt:

    Toller Artikel! Hab ihm mal im ZSH-Artikel bei uu.de verlinkt, aber könntest du dein Wissen da vielleicht noch direkt einbauen?

  19. Jörg sagt:

    Ey, das ganze klingt aber ganz schön kompliziert für mich. Kriegt dass auch ein Amateur wie ich hin? Ich werd´s mal testen und hoffe dass ihr mir ggf. noch ein paar Fragen dazu beantwortet…

  20. Qbi's Weblog sagt:

    links for 2010-02-20…

    Die Z-Shell (zsh) – Eine mächtige Alternative zur Bash | zInformatik (tags: zsh shell)…

  21. anonymous sagt:

    Wie kann man denn Tasten wie POS1, ENDE und Strg+Pfeil links um zwischen Wörtern zu springen aktivieren? Standardmäßig funktioniert ja nichtmal die Entfernen-Taste :(

  22. zimon sagt:

    Hallo,

    bei mir funktionieren POS1, ENDE und Entf. Du kannst sie sonst über Keybindings einrichten.
    z.B.

    bindkey '\e[1;5D' backward-word

    Um die Codes heraus zu finden, kannst du in vim im Insert-Modus einmal Strg+v eingeben und dann die gewünschte Taste/Tastenkombination. Das erste ^[ ersetzt du dann durch \e. Das bindkey-Kommando kommt am besten in die ~/.zshrc

    Alle möglichen Kommandos (Widgets) findest du hier: http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC128

    Praktisch ist es auch sich die Kombination Shift+Strg+Pfeil-links auf backward-kill-word zu legen und entsprechend für Pfeil-rechts. Dann kann man Wörter nach links und rechts recht einfach löschen.

    Viele Grüße,
    zimon

  23. [...] Z-Shell erfreut sich z.Zt. mehr Beachtung? Oder folgt hier Einer dem Anderen? Lohnend ist es auf jeden Fall, sich damit zu beschäftigen – es gibt nicht nur die Bash. [...]

  24. Eric sagt:

    Danke, gefällt mir sehr gut.
    Da existieren tatsächlich Funktionen, die mir bei der Bash noch fehlten

  25. [...] ist aber umso mächtiger. Dazu gibt es eine eigene Wiki-Seite. Es gibt auch unter Ubuntu eine Möglichkeit, die Zsh zu nutzen. Bei Bedarf lässt sich aber unter grml auch eine andere Shell nutzen, so [...]

  26. Nils sagt:

    “Die Autokorrektur aktiviert man mit der Option correct”

    wie aktiviert man eine Option?

  27. zimon sagt:

    Hallo Nils,

    Optionen werden mit dem Befehl setopt gesetzt. Dies kann man auch so in die Konfigurationsdatei ~/.zshrc schreiben.

    Demnach durch die Eingabe von

    setopt correct

    oder in dem man diese Zeile in die ~/.zshrc schreibt.

    Viele Grüße,
    zimon

  28. pSub sagt:

    Schöner Artikel! Obwohl ich die zsh nun schon seit 2 Jahren benutze, kannte ich das Modul zftp noch nicht. Danke für den Tipp!

  29. Martin sagt:

    Wirklich sehr toller Artikel.

    Übersichtlich strukturiert und (relativ) einfach erklärt :)

  30. […] andere Shells wie etwa die Z-Shell aka zsh (Wikipedia) machen es aber noch einmal deutlich besser. Marcel von zInformatik oder Kushellig haben die wichtigsten Funktionen der zsh in meinen Augen recht gut zusammengefasst. […]

Kommentieren

Kommentarlinks könnten nofollow frei sein.