1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. In diesem Bereich findet ihr Tutorials und Reviews. Die Forenrechte zur Erstellung neuer Themen sind hier eingeschränkt, da Problemdiskussionen bitte in den übrigen Forenbereichen auf Apfeltalk zu führen sind. Wer ein Tutorial oder Review einstellen möchte, kann im Unterforum "Einreichung neuer Tutorials" ein neues Thema erstellen. Die Moderatoren verschieben den Beitrag dann in den passenden Bereich.
    Information ausblenden

[TUTORIAL] Terminal - Teil 1

Dieses Thema im Forum "Software-Tutorials" wurde erstellt von Hobbes_, 07.04.07.

  1. Hobbes_

    Hobbes_ Gast

    Hallo zusammen,

    Wie ich in der Liste gesehen habe, wurde noch ein Tutorial zu Terminal gesucht...

    (0) Einleitung
    Für den Alltag eines üblichen Mac-Users braucht es das Programm Terminal eigentlich nicht. Da geniesst man die aufgeräumte Benutzeroberfläche. Ein direkter Zugriff auf den UNIX-Unterbau des Mac OS X – Darwin – kann in verschiedenen Fragestellungen nützlich sein (Benutzung von Compilern ohne Integration ins IDE, Netzwerkaufgaben, Benutzung von Spezialprogrammen, Definition von Skripten / Cron-Jobs,...). Da sehr viele Web-Server übrigens Linux-Server sind (LAMP), helfen diese Kenntnisse gleichzeitig auch, einen solchen Web-Server besser zu verstehen.

    Dieses Tutorial richtet sich in erster Linie an Mac-User, welche noch keinen Kontakt mit Terminal hatten (es ist bewusst sehr einfach gehalten und erklärt einige Details bewusst noch nicht). Aus Platzgründen wird das Tutorial auf verschiedene Posts verteilt.

    Wer übrigens bereits Kontakt mit einer Linux- oder einer UNIX-Distribution hatte, kann dieses Tutorial wohl getrost überspringen. Daneben empfiehlt sich bei ernsthafter weiterer Benutzung zumindestens ein kleines Buch über UNIX.

    Selbstverständlich ist dieses Tutorial erweiterungsfähig. So bin ich froh um konstruktive Kritik (Fehlermeldungen / Erweiterungsvorschläge).

    Viel Erfolg!
    psc


    Inhalt
    Teil 1
    (1) Das Programm
    (2) Unix als System
    (3) man
    (4) Einige Befehle

    Teil 2
    (5) I/O-Redirection / Pipes und Wildcards / Regular Expressions
    (6) Editoren vi/vim, Emacs und nano
    (7) "Pimp my Terminal"

    Teil 3
    (7) "Pimp my Terminal" (Fortsetzung)
    (8) User / Admin / Superuser

    Teil 4
    (8) User / Admin / Superuser (Fortsetzung)
    (9) Wie komme ich zu UNIX-Programmen?

    Teil 5
    (10) Einige Unterschiede zwischen Darwin und anderen UNICES
    (11) Weitere Informationen / Referenzen / Links
    Dank

    Einige spezielle Zeichen
    Im Verlauf dieses Tutorials werden einige spezielle Zeichen notwendig werden: ~ # [ ] { } / | \ < >
    Wer diese noch nicht benutzt hat, kann sie am einfachsten hier nachschlagen:
    Apfel --> Systemeinstellungen --> Landeseinstellungen --> Tastaturübersicht​



    (1) Das Programm
    Das Einfachste zuerst: Das Programm Terminal findet sich im Verzeichnis
    /Programme/Dienstprogramme​
    Damit wird ab Panther (10.3) in einem neuen Fenster standardmässig bash angezeigt. bash ist kurz gesagt ein Interpreter, welcher die eingegebenen Kommandos ans System weitergibt. Diese Form der Benutzerumgebung wird auch Shell genannt (siehe bash / Shell). So arbeitete man früher mit allen Computern bevor die heute üblichen grafischen Benutzeroberflächen Standard wurden.
    Eine Shell erlaubt neben direkten Benutzereingaben auch das Ausführen von Skripten (Unix war ursprünglich spezialisiert darauf, möglichst viele Funktionen mit kompakten Programmen zu ermöglichen, welche mittels solcher Skripte verbunden waren) sowie eine gewisse Editierbarkeit der Befehle.

    So sieht bash beim Start aus. Eine freundliche Begrüssung durch Darwin:

    Last login: Fri Apr 6 16:42:04 on console
    Welcome to Darwin!
    MacXYZ:~ Benutzername$


    Die unterste Zeile ist der sogenannte Prompt, hinter welchem die Befehle eingegeben werden. MacXYZ ist der Name des Computers. Dann folgt das aktuelle Verzeichnis. Dabei muss man wissen, dass die Tilde ~ ein Verweis auf das eigene Benutzerverzeichnis ist. Standardmässig beginnt bash im Benutzerverzeichnis. Dahinter folgt der Benutzername. Das Dollarzeichen $ dahinter zeigt, dass bash im Benutzermodus betrieben wird, in dem einige Befehle nicht möglich sind. Ein Gartenzaun # würde zeigen, dass man sich als Superuser (root) angemeldet hat mit vollem Zugriff (siehe unten)...

    Ich benutze diese Zeichen in diesem Tutorial auch, um den Prompt am Anfang verkürzt zu symbolisieren.

    Geben wir einen ersten Befehl ein (darauf hast Du ja sicher gewartet :) ):
    Als erstes benutzen wir ein Programm, das uns eine Auflistung des Verzeichnisses gibt (ls = list directory contents). Gib mal ls ein (also LS kleingeschreiben) und betätige den Zeilenvorschub.

    Gratulation! Damit siehst Du eine Auflistung der Verzeichnisse und Dateien des aktuellen Verzeichnisses ~ (Dein persönliches Benutzerverzeichnis). Unten zeigt sich ein erneuter Prompt für den nächsten Befehl. Erklärungen folgen weiter unten im Tutorial

    Die Shell wird mit dem Befehl exit beendet.


    (2) Unix als System
    Die Benutzung des Terminals setzt die Kenntnis einiger grundsätzlicher Elemente eines UNIX-Systems voraus. Es ist extrem logisch aufgebaut (das Design gefällt mir immer wieder).
    UNIX (bzw. initial UNICS) wurde als Multiuser-System konzipiert (sehr interessant: UNIX, Geschichte). Zumindest gerüchtehalber wurde es initial nur entworfen, um ein bestimmtes Spiel (Space Travel) auch auf einem anderen Computern betreiben zu können. Daneben ist die Geschichte von UNIX nur schon durch dessen Hauptautoren eng mit der Entwicklung der Programmiersprache C verknüpft.

    (2.1) Rechte in Unix
    Ein Multiuser-System setzt eine strikte Rechteverwaltung voraus. Rechte werden für jede Datei vergeben bezüglich
    • lesen (R für read)
    • schreiben (W für write)
    • ausführen (X für execute)

    Diese Rechte werden separat angegeben für
    • Benutzer (sozusagen der Besitzer der Datei)
    • Gruppe (Listen aus verschiedenen Benutzern)
    • Alle
    Ein weiteres Flag definiert spezielles (zB ein Verzeichnis oder einen Link auf eine Datei)

    So kann beispielsweise definiert werden, dass nur der Besitzer eine Datei lesen und schreiben darf, eine definierte Benutzergruppe die Datei lesen kann, jedoch andere Computerbenutzer die Datei nicht einmal lesen dürfen.

    Spezielles | Benutzer-Flags (rwx) | Gruppen-Flags (rwx) | Alle-Benutzer-Flags (rwx)

    Beispiel:
    drwx------ 5 User User - 170 Jul 3 2006 Music

    Klar ein Verzeichnis (d am Anfang), der Benutzer ‚User’ darf das Verzeichnis sehen, darf schreiben und darf es öffnen (Das Ausführen eines Verzeichnisses (x) bedeutet es zu öffnen). Diese Rechte werden allen anderen Benutzern des Computers verweigert.

    -rw-r----- 1 User GruppeA - 557 Jul 27 2006 beispiel.txt

    Die Datei beispiel.txt darf vom Benutzer gelesen und beschrieben werden. Benutzer, die Miglieder der Gruppe GruppeA sind, dürfen die Datei lesen. Andere Benutzer des Computers dürfen die Datei nicht einmal lesen. Die Datei hat keine Berechtigung ausgeführt zu werden. Das ist gut so: Die Datei ist ja auch kein Programm.

    Probier es selbst mal aus. Benutze mal folgendes Kommando
    $ ls –l

    Info: Der Befehl ls steht für ‚list directory content’. Die Buchstabenkürzel hinter dem Gedankenstrich sind Optionen (werden weiter unten erklärt).

    Resultat: Du siehst die Rechteverteilung aller Dokumente Deines Verzeichnisses.

    Ergänzend zu diesen klassischen POSIX-konformen Dateirechten erlaubt Mac OSX ab 10.4 (Tiger) auch eine genauere Rechteverteilung mittels Access Control Lists (Granularität, siehe Kapitel 10)

    (2.2) User / Admin / Superuser
    UNIX basiert auf einem hierarchischen Rechte-System, in dem definiert ist, was ein bestimmter User machen darf. Grundsätzlich wird in UNIX-Systemen zwischen einem Superuser (meist ‚root’ genannt) und gewöhnlichen Benutzern mit klar eingeschränkten Rechten unterschieden. Der Superuser hat alle Rechte auf dem System. Damit besteht jedoch auch das Risiko, dass sich Fehler negativ auf das ganze System auswirken.
    Oftmals legt man neben dem eigentlichen Superuser root weitere User mit Administrationsrechten an, welche gezielt auf einzelne Elemente des Systems Einfluss nehmen können (heutzutage übliche "Rollenbasierte Administration", die auch in Darwin konsequent umgesetzt ist).
    Nebenbei: Darwin ist in dieser Hinsicht speziell, dass der in Benutzereinstellungen mit Administrator-Rechten ausgestattete Benutzer dieser Zwischenform entspricht und nicht etwa 'root'. Wenn man sich unbedingt als root einloggen können möchte, dann muss man das im Netinfo Manager speziell aktivieren. Dies ist jedoch nichts für uns Einsteiger :) Es ist auch nicht notwendig (siehe Kapitel 8 in Teil 3).

    Das oben erwähnte Benutzerverzeichnis ~ des aktuellen Benutzers ist übrigens im Verzeichnis /Users/Benutzername/ abgelegt. Wir gehen das gleich mal anschauen...

    Dazu kurz eine Info über einige definierte Verzeichnisse:
    / Basisverzeichnis des Systems (root)
    ~ Benutzerverzeichnis des aktuellen Benutzers
    ~name Benutzerverzeichnis des Users name
    . aktuelles Verzeichnis
    .. Verzeichnis oberhalb des aktuellen in der Verzeichnishierarchie

    Wichtig: Zwischen dem Basisverzeichnis / (root) und dem Superuser (ebenso meist root genannt; hat UID 0) muss klar unterschieden werden.

    Die Daten sind ausserordentlich gut geordnet. Anbei eine kurze Zusammenstellung der typischen Verzeichnisse eines UNIX bzw. Linux Systems. Mac OS unterscheidet sich in einigen Punkten jedoch grundsätzlich (siehe Kapitel 10).

    Relative und absolute Verzeichnisbezeichnungen
    • Ein absolute Verzeichnisbezeichnung definiert sich immer ab dem
      Basisverzeichnis / . Beispiele:
      /Users/psc/.Trash
      /Users/psc/Testdateien/anderes/dummy.txt
    • Eine relative Verzeichnisbezeichnung definiert sich immer ab dem aktuellen Verzeichnis. Daran muss insbesondere gedacht werden, wenn ein Befehl wiederholt wird, wenn zwischenzeitlich das Verzeichnis gewechselt wurde. Beispiele:
      psc/.Trash
      ../dummy.txt
    Zum Wechseln des Verzeichnisses benutzen wir den Befehl cd (change directory)

    Also: Wir sind ja jetzt immer noch in unserem heimatlichen Benutzerverzeichnis ~, nicht wahr?

    Gehen wir also mal ein Verzeichnis nach oben:
    $ cd ..

    Wir sehen am Prompt, dass das Verzeichnis gewechselt hat. Es ist jetzt /Users
    MacXYZ:/Users Benutzername$


    Weil es so schön war, nochmals

    $ cd ..

    Jetzt sind wir im Baisisverzeichnis, also in root. Das aktuelle Verzeichnis wird im Prompt auch mit / angegeben.

    MacXYZ:/ Benutzername$

    Jetzt schauen wir mal, was es da so hat:
    $ ls –l (die Option ist ein kleines L)

    Wir sehen vor allem eine Liste von Verzeichnissen (d am Anfang der Flags), die verschiedenen Benutzern gehören und verschiedenen Gruppen den Zugriff ermöglichen. Wir sehen auch das Verzeichnis Users, in dem letztlich alle Benutzerverzeichniss sind.

    Gehen wir nochmals dorthin zurück. Wir benutzen
    $ cd Users/Benutzername

    Einfacher geht es auch mit folgendem Befehl. Er führt immer zurück ins eigene User-Verzeichnis:

    $ cd ~

    Mit cd und ls können wir also das ganze System mal ausloten und uns eine Information holen, was wo so gespeichert ist. Der Finder ist da natürlich wesentlich schneller und attraktiver. Jedoch sehen wir dort nie direkt so viele Details wie im Terminal.

    (2.3) Präzision im System
    Im Gegensatz zu den Shells anderer Betriebssysteme ist UNIX nicht tolerant. Da kommt es auf jedes Leerzeichen, sowie auf Gross- und Kleinschreibung an. Die Shell nimmt einen absolut beim Wort und tut, was man sie beauftragte zu tun. Das muss nicht zwingend das sein, was man selbst beabsichtigte zu tun. Diese verlangte Disziplin ist zu Beginn mühsam; hilft dann später, dass man sich wirklich klar sein kann, was passiert.

    Ach ja: Im Finder gibt es die Möglichkeiten auch Dateien mit Leerzeichen im Dateinamen zu haben. Pfade zu solchen Dateien müssen mit Anführungs- und Schlussstrichen gekennzeichnet werden. Sonst werden fälschlicherweise mehrere Parameter angenommen:

    $ less "~/irgend ein Verzeichnis/noch ein Verzeichnis/irgend eine Datei.txt"


    (3) man
    Als nächsten Befehl lege ich man (kurz für Manual = Bedienungsanleitung) ans Herz. Dieser ist einer der hilfreichsten Befehle, der zu jedem Befehl eine kurze Bedienungsanleitung enthält. Wichtig ist insbesondere Erklärung der Optionen (jeweils hinter dem Gedankenstrich angeführt) und anderer Parameter (zB. die bereits benutzten Verzeichnisnamen).

    Schauen wir mal, was ls so für Optionen bietet:
    $ man ls

    Eine ganze Menge, nicht wahr :) . Dabei findet man auch, was die Option -l bedeutet, die wir oben für ls benutzt haben.

    Das ganze ist (leider) in Englisch gehalten. Gerade für Arbeiten auf Systemebene oder zum Schreiben von Programmen lohnt es sich, Englisch zu lernen (selbstverständlich gibt es auch andere Gründe :) )...
    Anbei ein Link mit einem Online-man mit deutschen Texten (leider unvollständig): man in Deutsch

    man basiert im aktuellen OSX auf dem Programm less (früher more), welches man allgemein zum Anschauen von Textdateien benutzen kann. Entsprechend können alle Optionen benutzt werden. Nur die wichtigsten kurz zusammengefasst:
    h --> Hilfeseite (wird dann wieder mit q verlassen)
    q --> Programm beenden

    Pfeiltasten --> zeilenweise nach oben oder unten
    w --> ganze Seite nach oben
    z oder Leertaste --> Ganze Seite nach unten
    g --> an den Anfang des Dokuments
    G --> an den Schluss des Dokuments

    /test --> Suche nach dem Wort test (man kann auch reguläre Ausdrücke verwenden)
    n --> nächste Fundstelle vorwärts
    N --> vorgängige Fundstelle rückwärts​
    Wir sehen: UNIX-Programme bieten ausserordentlich viele Optionen...

    Dabei lege ich insbesondere die Suchfunktion ans Herz, da man so rasch die Bedeutung der Optionen anzeigen lassen kann. Beispiel:
    $ man ls
    Eingabe: /-l
    n bzw. N nach Bedarf​

    Auch cd und man selbst haben einiges zu bieten:
    $ man cd

    bzw.

    $man man

    Auch bash hat selbstverständlich seine eigene manpage:
    $man bash


    Eine kurze Hilfe bieten auch oft die Programme selbst. Einige haben eine Option -h bzw. --h, mit denen sie die wichtigsten Parameter angeben. Den Schlüssel zum Erfolg bringt jedoch meist man.

    (4) Einige Befehle
    Mit der Shell kann man sich selbstverständlich nicht nur das Verzeichnis anzeigen lassen. Der Schlüssel zum Erfolg ist die genaue Kenntnis der vorhandenen Befehle (teilweise Elemente der Shell, teilweise Programme, teilweise Scripts). Zu Beginn ist man erstaunt, wie viele Probleme in UNIX nicht durch Programme, sondern durch Scripts gelöst werden, welche auf basalste Programme zurückgreifen.
    Um nicht einfach eine Liste wiederholen zu müssen, verweise ich auf eine externe Quelle. Wichtig ist, dass ein Befehl genau verstanden wird, bevor er eingegeben wird. Bereits als User kann man schon einige Dinge löschen, als Admin/Superuser kann man mit wenigen Tasten das System unbrauchbar machen. So lohnt es sich, einen Befehl gerade bei kritischen Befehlen zu prüfen, bevor man ihn mittels der Eingabetaste zur Ausführung bringt...
    Diese Informationen können durch das integrierte Hilfesystem leicht erhalten werden. Ein man <irgendeinBefehl> lohnt sich wohl vor jeder ersten Anwendung. Ich empfehle deshalb, sich nun auch etwas Zeit zu nehmen und sich die wichtigen Befehle zB. aus dieser Liste in man oder online anzusehen. (Nebenbei: Es hilft zu wissen, dass Darwin ein Derivat des BSD-UNIX ist mit POSIX-Kompatibilität)

    Da sich nur wenige Leute schon zu Beginn alle Optionen der Befehle locker merken können ;), sind Übersichtskarten mit typischen Befehlen (Beispiel [PDF]) praktisch.

    (4.1) Wisse, was Du tust!
    Aufgrund der sehr kompakt gehaltenen Befehle können teilweise bereits einzelne falsch eingegebene Buchstaben aus einem problemlosen Kommando ein Problem grösserer Tragweite produzieren. Dabei gilt es insbesondere auch zu beachten, dass UNIX strikt zwischen Gross- und Kleinschreibung unterscheidet. Dies ist insbesondere wichtig, da es einige Buchstaben gibt, die als unterschiedliche Optionen verwendet werden, je nachdem ob gross- oder kleingeschrieben.
    Dies soll nicht Angst machen, das System zu benutzen. Eine Wachsamkeit ist vor Betätigung der Return-Taste jedoch immer angebracht...

    Einige wichtige Befehle, die sich als erstes nachzuschlagen lohnen
    • Dateien: ls (list, Dateien listen), cp (copy, kopieren), mv (move, verschieben), rm (remove, löschen), touch (Datei berühren), open (Mac spezifisch)
    • Verzeichnisse: pwd (aktuelles Verzeichnis anzeigen), cd (change dir, Verzeichnis wechseln), mkdir (make dir, neues Verzeichnis erstellen), rmdir (remove dir, leeres Verzeichnis löschen).

    Diese Befehle stellen zahlreichste Optionen zur Verfügung, welche man am besten in den man pages nachsieht. Dazu gehören so mächtige Optionen wie rekursive Anwendung (zB. Kopieren ganzer Unterverzeichnisse - jedoch auch Löschen ganzer Dateibäume mit allen Dateien...). Daneben gibt es Sicherheitsoptionen, welche es ermöglichen, eine Sicherheitsfrage aufzurufen. Wir werden weiter unten noch sehen, wie solche Sicherheitsoptionen mittels alias direkt standardmässig "aktiviert" werden können.

    (4.2) Von offenen und versteckten Dingen
    Neben normal sichtbaren Dateien gibt es auch versteckte Dateien. Diese haben meistens einen Bezug zum System, so dass Manipulationen erst recht sorgfältig vorgenommen werden müssen (gewisse Dinge kann man nicht oft genug sagen :) ). Versteckte Dateien haben einen Punkt (.) am Anfang des Namens. Schauen wir uns mal die versteckten Dateien unseres Benutzerverzeichnisses an.

    $ cd ~
    $ ls -lA


    Wir sehen eine neue Option -A für ls. Dabei gilt, dass ls -l -A gleichwertig zu ls -lA ist.

    Als Übung empfehle ich mal mittels man nachzuschauen, was der Unterschied zwischen ls -la und ls -lA ist.

    Daneben können wir uns ja mal anschauen, was wir so im Abfalleimer haben:
    $ ls -l ~/.Trash

    (hoffentlich gut aufgeräumt...)


    (4.3) Abkürzungen durch den Wald
    Bis jetzt haben wir nur einzelne Beispiele von Shell-Befehlen angeschaut. Allgemein ist ein Befehl folgendermassen aufgebaut
    $ Programm [-Optionen] [-evtl.andereOptionen] [Parameter] [evtl.andereParameter]

    Beispiel - Vorbereitung:
    $ cd ~
    $ mkdir tutorial_test
    $ touch test.txt
    $ cp -i test.txt tutorial_test/test_april07.txt


    Beispiel:
    $ cp -i test.txt tutorial_test/test_april07.txt

    Erklärung: Wir wechseln in unser Benutzerverzeichnis. Wir erstellen ein Verzeichnis tutorial_test. Dann generieren wir eine Datei test.txt (bzw. aktualisieren das letzte Lesedatum, wenn sie bereits existieren sollte). Diese Datei test.txt wird dann nach tutorial_test/test_april07.txt kopiert. Wenn die Zieldatei bereits bestehen sollte, wird aufgrund der Option -i wird erst gefragt, bevor die Zieldatei überschrieben wird. Wir werden diese Sicherheitsoption noch häufiger nutzen...

    Daneben sehen wir, dass wir jetzt zweimal denselben Befehl hintereinander eingegeben haben. Das müsste sicher auch einfacher gehen... Richtig: Nun kommen einige der Vorteile der Shell zum tragen. Die Shell merkt sich die letzten Befehle.
    Wenn wir die Pfeiltaste nach oben benutzen, wird jeweils der letzte Befehl vorgegeben, der direkt ausgeführt oder auch zuerst modifiziert werden kann. Dies kann mehrfach wiederholt werden, so dass wir rasch einen der letzten Befehle erneut ausführen können.

    Wir können auch die ganze Liste ansehen:
    $ history

    Wir sehen eine durchnummerierte Liste mit allen vorgängigen Befehlen. Selbstverständlich haben diese Nummern ebenso eine Bedeutung :)

    Nehmen wir die Nummer des obenstehenden Befehls mit cp. Wir können ihn auch ausführen, indem wir einfach dessen Nummer benutzen. Wenn wir annehmen, dass er Nr 12 wäre, so geben wir ein
    $ !12

    That's it! Das ist schon recht praktisch, nicht wahr.

    Nur so aus Interesse: Wo speichert bash seine History? Schauen wir sie uns mal an.
    $ less ~/.bash_history
    Es ist also eine einfache versteckte Datei in unserem persönlichen Verzeichnis.

    Weitere Editierbefehle schauen wir uns später an: Kapitel 7, Teil 3).


    Link: Fortsetzung Teil 2
     
    #1 Hobbes_, 07.04.07
    Zuletzt von einem Moderator bearbeitet: 04.11.09
    rakader gefällt das.
  2. Bonobo

    Bonobo Nathusius Taubenapfel

    Dabei seit:
    26.12.03
    Beiträge:
    5.482
    Cool!

    Was ich mir auch als Naechstes wuenschen wuerde, ist u.a.

    - wie ich meinen Prompt aendern kann

    - wie ich (wahrscheinlich mit alias?) Kuerzel fuer Befehle und Befehlsketten anlegen kann

    - wie ich meine Befehlshistory bearbeiten kann, so dass mit Pfeil rauf bzw. Pfeil runter die Duplikate herausgefiltert werden etc. etc.


    Ich bin ganz neugierig auf Weiteres ... hab' frueher auf dem NeXT mal bissl in der Shell "gespielt" und wuerde jetzt gerne wieder bissl tiefer einsteigen.
     
  3. KayHH

    KayHH Gast

    „~/.bash_profile“ anlegen und z.B. „alias ll='ls -la'“ hinein schreiben. Gruss KayHH
     
  4. Bonobo

    Bonobo Nathusius Taubenapfel

    Dabei seit:
    26.12.03
    Beiträge:
    5.482
    OK, danke, hier laeuft die TCSH (voreingestellt), ich habe inzwischen auch /usr/share/tcsh/examples/ gefunden ... das wird mich eine Weile beschaeftigen ;)


    Interessant waere auch bissl Info zu den verschiedenen Shells, warum diese, warum nicht jene etc., auch wenn das vielfach einfach Geschmackssache ist. Soweit ich weiss, unterscheiden sich die Shells durchaus in Sachen Komfort.
     
  5. Hobbes_

    Hobbes_ Gast

    Vielen Dank für all die zahlreichen positiven Feedbacks. Dies motiviert enorm! Die angebrachten Wünsche werde ich im Verlauf einbauen (siehe geändertes Outline).

    Ich hoffe, dass sich dieses Tutorial wirklich in einen einfachen und sicheren Einstieg in Darwins Welt entwickelt. Selbstverständlich freue ich mich weiter über konstruktive Vorschläge entweder per PM oder als Post.

    Dieses Tutorial soll übrigens niemandem die geniale Benutzeroberfläche des Macs abspenstig machen. Gerade diese einfachste Bedienbarkeit des Computers ist dessen unangefochtene Stärke. Die UNIX-Grundlage eröffnet jedoch einfach Optionen für weitere Zusatzprogramme...

    Viel Vergnügen!
    psc
     
  6. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Bei dem Thema kann ich mich natürlich nicht zurückhalten und muß auch meinen Senf dazugeben. Vorweg, herzlichen Dank an psc für die Arbeit.

    Man kann auch hier im Forum bequem auf lokale Pfade am Computer verlinken, so beispielsweise um das Auffinden des Terminals zu vereinfachen: Terminal (Dies funktioniert auch bei unterschiedlichen Lokalisierungen von Mac OS X.) Wenn das Terminal schon läuft wird es in den Vordergrund geholt, läuft es noch nicht, so wird es im Finder angezeigt (nicht gestartet, denn das wäre eine böse Sicherheitslücke).


    Ad "Einige spezielle Zeichen":
    Deine Angaben beziehen sich auf ein bestimmtes, nicht genanntes Tastaturlayout. Dies muß nicht zwangsläufig mit dem des Benutzers übereinstimmen. Ich persönlich verwende eine (physisch) deutsche Tastatur mit einem (logischen) österreichischen Layout. Dort ist beispielsweise das von Dir genannte Zeichen # (Hashmark, Doppelkreuz, Raute, Gartenzaun) nicht per alt-3 zu erreichen sondern hat eine eigenen Taste. (Auf alt-3 bekommt man dafür das Absatzzeichen.)

    Ein Blick in die (? > Systemeinstellungen > Landeseinstellungen >) Tastaturübersicht sollte es jedem ermöglichen bei seinem eigenen verwendeten Tastaturlayout die korrekten Tasten für Sonderzeichen zu finden.


    Ad (1):
    Die Shell bash ist seit 10.3 (Panther) die Standardshell von Mac OS X. Davor war es die tcsh, so wie es bei BSD nahen Unices üblich ist. Mit Panther hat sich Apple entschlossen die Standard-Shell auf bash zu ändern, diese ist bei Linux Systemen üblich.
    Selbstverständlich kann man auch unter Mac OS X andere Shells wie die csh, ksh oder auch die zsh verwenden.

    Es ist meiner Ansicht nach durchaus sinnvoll sich in diesem Tutorial auf die bash zu konzentrieren da für die Einsteiger die Unterschiede kaum relevant sein dürften und diese bei allen "aktuellen" Mac OS X Versionen die Standard-Shell ist.


    Ad 2.2 "User / Admin / Superuser"
    Der Superuser muß nicht zwingend root heissen. Tatsächlich ist es erlaubt (und in manchen Unix Varianten sogar gebräuchlich), daß dieser User einen anderen Namen (und Kurznamen) trägt. Bei Mac OS X hieß der System Administrator mit Kurznamen immer root. Bei anderen BSD Systemen gibt auch Superuser die avatar, baron oder toor heissen.
    Allen Superusern gemein ist bisweilen, daß sie die User ID 0 (Null) haben und alle wheel Bits gesetzt haben. Also im Single-User und im Multi-User Betrieb alle Rechte an Filesystem Objekten besitzen.

    Korrektur:
    Der root User wird in Mac OS X nicht wie von Dir beschrieben in den Systemeinstellungen aktiviert, sondern entweder im Netinfo Manager oder im Terminal mittels sudo passwd root (als Admin User). Dies ist jedoch definitiv nicht notwendig und sei auch nicht empfohlen! (Schon garnicht für Einsteiger.)

    Vorschlag:
    Um Verwirrungen hintanzuhalten fände ich es durchaus sinnvoll noch etwas deutlicher auf den Unterschied zwischen root User (UID 0) und root Directory (/) hinzuweisen.


    Korrektur:
    Das ist inkorrekt. Es ist ein Unterschied zwischen dem ganzen System und dem Filesystem. Auf Das root Verzeichnis muß sogar jeder Benutzer zumindest lesend (r-x) zugreifen dürfen, sonst ist dieses System nicht für User/Prozesse benutzbar die nicht dem root User gehören. Unter Mac OS X haben alle Admin User Schreibrechte in /. (Was meiner Ansicht nach ein Bug in Mac OS X ist und wohl ein Tribut and Mac OS 9 Unsitten.)


    Ergänzung:
    Dies ist heutzutage üblich und wird "Rollenbasierte Administration" genannt. In Bereichen mit hochsensiblen Daten ist es zwingend notwendig so zu arbeiten. Mac OS X verwendet dieses moderne Konzept.


    Ad (2.1) Rechte in Unix
    Du beschreibst die sogenannten klassischen Zugriffsrechte, sog. POSIX Rechte. Es gibt darüber hinaus noch sogenannte Access Control Lists die auf den POSIX Rechten aufsetzen und weitaus genauere Einteilung (Granularität) von Rechten erlauben. ACLs sind seit Mac OS X 10.4 (Tiger) optional, mit Mac OS X 10.5 (Leopard) werden sie als Standard aktiv sein. ACLs können per ls -e angezeigt werden. Für den Einsteiger ist nur wichtig, daß die einen so heissen und, daß es die anderen auch gibt.


    Korrektur:
    Es sind die Tasten h und q (Kleinbuchstaben), Unix unterscheidet sehr genau zwischen Groß- und Kleinbuchstaben (Case sensitive). (Beispielsweise ist ein großer Unterschied zwischen ls -r und ls -R. Welcher Unterschied besteht, läßt sich bequem über die man page von ls herausfinden. Im speziellen Fall von ls kann man es auch gefahrlos ausprobieren.)


    Ergänzung:
    Mir geht das wichtige Thema Trennzeichen ab. Die Shell nimmt einen absolut beim Wort und tut was man ihr angeschafft hat. Das muß nicht zwingend das sein was man tun wollte.
    Die üblichen Trennzeichen sind das Leerzeichen, der (horizontale) Tabulator sowie ein Return Zeichen (Zeilenvorschub). Ein Trennzeichen trennt ein Kommando (zB ls) von dessen Optionen/Parametern (zB -A) und auch einzelne Argumente (zB ..). Es ist also ein Unterschied ob ich ls -a oder ls-a eingebe. Ersteres wird mir den Inhalt des aktuellen Verzeichnisses auflisten, so mir das erlaubt ist. Letzteres wird in -bash: ls-a: command not found resultieren, da es kein Kommando gibt welches literal ls-a heißt.
    Unter (MS-)DOS ist man hier nicht so exakt. Beispielsweise wird dort cd .. und cd.. ident behandelt. Eine Unix Shell ist hier (zum Glück) genauer und unterscheidet.


    Ergänzung:
    Beim Link "Unix Referenz-Karte (Christof Böckler)" sollte man ergänzen, daß es sich um einen direkten Link zu einer PDF Datei handelt.


    Erweiterungsvorschläge:
    Wie man eine man page liest, Hilfe zur Selbsthilfe.

    Einfache Steuersequenzen (^C, ^D, ^E, ^A, ^K, ^S, ^Q, esc-b, esc-f)

    Wildcards und einfache Regular Expressions (*, ?, [01234], etc.)

    Wo finde ich commands und die Unix Verzeichnisstruktur (/bin, /sbin, /etc, /var, /usr)

    Plumbing (Pipes (5)) ist ja schon geplant. Hier wird man den praktischen Nutzen der Shell und die sehr intelligente Verbindung von vielen kleinen spezialisierten Tools deutlich sehen können.

    Interaktive Texteditoren in der Shell (vim/vi, emacs, nano/pico) und warum es sinnvoll ist vi/vim (zumindest grundlegend) bedienen zu können.

    Das Environment und seine Variablen.


    Man verzeihe mir bitte das etwas überlange Posting. :)
    Gruß Pepi
     
    rakader und Bonobo gefällt das.
  7. Bonobo

    Bonobo Nathusius Taubenapfel

    Dabei seit:
    26.12.03
    Beiträge:
    5.482
    Bei mir geschieht keines von Beiden, das Terminal laeuft bei mir in letzter Zeit immer im Hintergrund, da ich ab und zu "zprint load_file_server" eingebe, um die Anzahl der aktuellen Elemente (? offenen Dateien?) beobachte, auf Hinweis in einem anderen Forum, um zu sehen, wann bestimmte Probleme auftreten, die allerdings seit 10.4.9 nicht mehr aufgetreten sind ...


    Oh, dann hab ich's wohl irgendwann einmal auf tcsh gestellt ... mir waere z.B. die Komfortabilitaet einer Shell wichtig, wobei ich natuerlich kaum weiss, was "komfortabel" ist und was nicht. Aber zum Beispiel wuerde ich mir eine intelligente Befehlshistorie wuenschen, die automatisch Dubletten rausschmeisst ...





    Hahahahaha, alles verziehen :-D
     
  8. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Ergänzend hier noch ein Screenshot des ASCII Movie Players:
    [​IMG]

    Der Ausschnitt entstammt dem Spot "Security" aus Apple's aktueller "Get a Mac" Werbekampagne. Ein Bild in voller Auflösung ist verlinked.


    @Bonobo
    Wenn Du Dein System von 10.2 auf 10.3, 10.4 upgedatet hast, anstatt komplett clean zu installieren ist Dir die eingestellte Shell als tcsh erhalten geblieben. Ich bezog mich auf frische Installationen, bzw. solche die vom Werk aus aufgespielt waren.

    Die Verlinkung von lokalen Files hat manchmal Probleme wenn man diverse Browser Plug-Ins installiert hat. (zB Saft in Safari). Ich gehe davon aus, daß User die sowas verwenden soweit fortgeschritten sind, daß sie das Terminal von selbst finden. (Auch wenn diese Annahme nicht immer zulässig ist. :) )
    Gruß Pepi
     
    #8 pepi, 09.04.07
    Zuletzt bearbeitet: 09.04.07
  9. Hobbes_

    Hobbes_ Gast


    Hallo Pepi,

    Vielen Dank für das lange (nicht überlange :) ) Posting.

    Schon mit der Konzeption dieses "kleinen" Tutorials war mir bewusst, dass es ein letztlich endloses Thema werden wird. Ich weiss, es gibt noch einiges zu tun (work in progress). Deshalb bin ich um Input / Korrekturen / Verbesserungsvorschläge froh. Danke!

    Ich bin mir bewusst, dass es sehr viele Experten (zB. Dich) zu diesem Thema im Apfeltalk gibt. Sie mögen mir verzeihen, dass ich der Einfachheit halber einige für sie sehr differenziert klare Dinge klar vereinfacht habe, da sich dieses Tutorial in erster Linie an die Personen richtet, die das erste mal an Terminal / UNIX schnuppern. Sozusagen ein Beginners-Tutorial, auf das man dann aufbauen kann.

    Die genannten Verbesserungsvorschläge werde ich gerne berücksichtigen!

    Bezüglich Gross-/Kleinschreibung: UNIX unterscheidet ganz klar zwischen gross und klein. Dies kann insbesondere bei Optionen verhängnisvoll werden. Eine Erfahrung, die ich auch von Programmiersprachen machen musste... Dies ist ein Punkt, auf den ich noch eingehen wollte.
    Ein Unterschied, der mir bisher jedoch im gegensatz zu Linux aufgefallen ist, dass Darwin zB. für Verzeichniswechsel wenigstens in der von mir benutzten Shell bash case-insensitive ist, dh. es wird nicht zwischen /Users oder /users unterschieden. Ich nehme an, dass dies ein Kompromiss an das Verhalten im täglichen Gebrauch mit der GUI Aqua ist, so dass das Verhalten zu früheren OS-Versionen (Classic: auf 68k und PPC) konsistent gehalten werden kann. (?)
    Ja, man bzw. less wird v.a. mit h bzw q gesteuert (auch von mir). Sie akzeptieren jedoch gerne auch H und Q :)

    Das Ziel bleibt eine Einführung, so dass man dann auch die im speziellen Forum diskutierten Punkte nachvollziehen und nutzen kann. Es bleibt letztlich klar, dass sich der Anwender auf Shell-Ebene detailliert mit dem System auseinandersetzen muss, da das Potential einiger Kommandos sehr weitreichend ist und man sich sehr klar bewusst sein muss, was man da so tut...

    Vielleicht weckt ein einfaches Tutorial jedoch die Lust auf mehr!
    psc
     
    #9 Hobbes_, 09.04.07
    Zuletzt von einem Moderator bearbeitet: 09.04.07
  10. Tengu

    Tengu Apfel der Erkenntnis

    Dabei seit:
    05.02.07
    Beiträge:
    721
    Nen interessantes Thema könnten noch init Systeme sein. Da beschäftige ich mich grade eingehender mit. (wenn ich nicht grade mit seltsem .profile Fehlern oder mangelnder http Unterstützung grundsätzlich kämpfe :))

    Zwar erscheint mir insbesonders die Integration vom "Terminal" sehr eigenwillig gelöst bei MacOS, weil das als Teil des Interfaces läuft, aber das hat evtl. auch Vorteile.

    Ansonsten ist das Terminal ja auch nicht nur in BaSh nutzbar... Z Shell ist so grade mein zweites Thema technischer Weitbildung. Da kann man nett skripten.

    Naja... wenn das Tut so weit ist, schmeiß ich vielleicht noch eine kleine Anregung zu den Themen von oben rein.

    @Pepi: Der ASCII Movie Player ist ultrageil! Geekzone ist eröffnet!

    Man könnte ja nen Terminal-Themen Chat machen dazu. Ich wär dabei.
     
    #10 Tengu, 09.04.07
    Zuletzt bearbeitet: 09.04.07
    1 Person gefällt das.
  11. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Tengu,
    kannst Du noch etwas näher darauf eingehen was am Terminal unter Mac OS X Deiner Meinung nach eigenwillig gelöst ist?

    Skripten kann man generell in jeder Shell, nicht nur in einer bash oder zsh. Es gibt dann allerdings teilweise gröbere Unterschiede im Komfort und der Syntax.

    Der ASCII Movie Player ist übrigens ein Programmierbeispiel der ADC und hat mit Java nichts zu tun.
    Gruß Pepi
     
  12. Bonobo

    Bonobo Nathusius Taubenapfel

    Dabei seit:
    26.12.03
    Beiträge:
    5.482
    Das genau ist der Punkt, der mich derzeit am Meisten interessiert ... am Liebsten wuerde ich mal so'n Vergleich der Shells lesen ... Link waere schon genug, Englisch ist mir lieb.
     
  13. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Aufgrund der ganzen Unterschiede zwischen den Shells schreibe ich keine shell scripte mehr, wenn sie nicht lediglich dazu dienen, ein anderes Programm zu starten. Ansonsten schreibe ich alle Scripte in Perl... Wie wäre es mit einem Tutorial dafür? Jemand Interesse?
     
  14. Hobbes_

    Hobbes_ Gast

    Tja, tut mir leid. ;) Dieser Punkt kommt erst noch (siehe Punkt "Pimp My Terminal" 9.3). Einen kleinen Vergleich findest Du schon mal hier http://www.osxfaq.com/Tutorials/LearningCenter/UnixTutorials/WorkingWithUnix/page2.ws (Seitenteil).

    Gruss
    psc
     
  15. Bonobo

    Bonobo Nathusius Taubenapfel

    Dabei seit:
    26.12.03
    Beiträge:
    5.482
    Ich weiss nur, dass das eine beliebte Programmiersprache ist ... darum gerne :) (Update und Link hier waere nett, sonst krieg ich's wieder nicht mit.)

    Oh, OK, alles klar. Keine Eile ;)


    Daaaaaankeeeee!
     
  16. Tengu

    Tengu Apfel der Erkenntnis

    Dabei seit:
    05.02.07
    Beiträge:
    721
    Joahr pepi, kann ich. Vorweg: So einen Player gibts auch in Java... da hatte ich was verwechselt... gmpf ;)

    Aber zum MacOS Terminal nur nen kurzen Input von mir: Also es ist nur meine Meinung, und das muss nicht allgemein sein.

    Also wenn ich ein Betriebssystem habe, dass auf grafischer Basis bedient wird, dann tritt an die Stelle der Shell eigentlich das GUI. Jenes GUI sagen wir nun instantiiert einen Prozess, der instabil ist. Das System reagiert nicht mehr.
    Eigenwillig ist:
    • da das Terminal unter OS X stark in Aqua integriert ist, stürzt es mit ab. Das heißt ich kann nicht mal schnell die pid herausfinden und kill anwenden.
    • trotz der grafischen Integration werden die Vorteile, die man hätte (tabbed editing) nicht genutzt. Ich kenne zwar iTerm, aber das hat ja direkt nichts mit OS X zu tun.
    • Macht man also ernsthaft etwas: Kompilieren von C Programmen, rekursive z-shell skripte... dann steht man schon mal blöde da, weil man zum Beenden des Prozesses ins GUI muss. Oder man wartet halt auf den Stack Overflow.

    Aber ansonsten ists ja tatsächlich gleich. Innerhalb der z Shell Umgebung machts genauso viel Spaß wie eh und je.
    Wär ja auch schlimm, wenn man unixoider Basis seine Finger nicht mehr spielen lassen könnte. Man muss halt nur vordenken und aufpassen. Find ich mal so...

    @Skeeve
    Also an einem Perl Tut besteht Interesse. Habs nie genutzt. Bis jetzt ;)
     
  17. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Da inzwischen schon dreifach Interesse bekundet wurde, mir aber zum einen momentan die Zeit fehlt, zum anderen aber das Rad schon mehrfach erfunden wurde, verweise ich auf ein recht brauchbares Tutorial, auf das mich etinzi aufmerksam gemacht hat: http://perl-seiten.privat.t-online.de/

    Ich hoffe es nutzt Euch. Bei Fragen stehe ich gerne zur Verfügung. Wer des Englischen mächtig ist, ist bei Perl Fragen auch gut bei den Perl Mönchen (ich bin auch einer) aufgehoben.
     
    2 Person(en) gefällt das.
  18. rakader

    rakader Rhode Island Greening

    Dabei seit:
    29.10.06
    Beiträge:
    478
    Hallo psc,

    ich kann nur sagen: Hut ab. Und didaktisch nicht schlecht gemacht. Ich ackere das Tutorial durch.

    Gruß & Dank
    rakader
     
  19. Hobbes_

    Hobbes_ Gast

    Hallo rakader,

    Vielen Dank für die Blumen. Ich freue mich, wenn das Tutorial hilfreich ist. Viel Vergnügen mit der weiteren Beschäftigung damit. Ich gebe den Dank gerne auch an einige weitere Mitglieder von apfeltalk weiter, die mit grosser Unterstützung mitgeholfen haben, das Tutorial zu verbessern (siehe Danke-Bereich hier). Für Verbesserungsvorschläge bin ich dankbar (am einfachsten per PN).

    Gruss
    psc
     
  20. Bier

    Bier Pomme au Mors

    Dabei seit:
    24.08.07
    Beiträge:
    867
    Ha... endlich mal wen, den ich was fragen kann.

    Es gibt unter OS X iTerm und die Terminal.app.

    Wenn ich vim in der Terminal.app starte dann geht das eigentlich ganz fix von der Hand.

    Manchmal jedoch habe ich auf einem Server, auf den ich mich via ssh einlogge irssi sessions. Naja, was heisst manchmal. Jeden Tag. Da ich nicht herausfinden konnte, wie man in einer Screen Session den irssi (curses) Buffer nach oben scrollt, sondern via Terminal.app nur die lokale History mit der Bild-Auf Taste scrollte, nutze ich derzeit iTerm. iTerm seinerseits ist dem Terminal.app weit hinterher.

    Da ist dann das Problem, dass ich vim, egal von wo geöffnet, nicht mit den Pfeiltasten bedienen kann und nicht mit der Enf Taste. Das ist sehr nervig.

    Hat da jemand eine Lösung parat?

    Ich hab in meine zshrc Bindings geschrieben...

    Code:
    # common keys & so
    
    #
    # This file is sourced only for interactive shells. It
    # should contain commands to set up aliases, functions,
    # options, key bindings, etc.
    #
    # Global Order: zshenv, zprofile, zshrc, zlogin
    
    READNULLCMD=${PAGER:-/usr/bin/pager}
    
    if [[ "$TERM" != emacs ]]; then
    [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
    [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
    [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
    [[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
    [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
    [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
    [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
    [[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode
    
    [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
    [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
    [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
    [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
    [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
    [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
    
    # ncurses fogyatekos
    [[ "$terminfo[kcuu1]" == ""* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
    [[ "$terminfo[kcud1]" == ""* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
    [[ "$terminfo[kcuf1]" == ""* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
    [[ "$terminfo[kcub1]" == ""* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
    # [[ "$terminfo[khome]" == ""* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
    # [[ "$terminfo[kend]" == ""* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
    # [[ "$terminfo[khome]" == ""* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
    # [[ "$terminfo[kend]" == ""* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
    fi
    
    Die auskommentierten letzten 3 Kommandos funktionieren auf einem aktuellen Debian wunderbar... unter OS X nicht. Ich nutze zsh...
    Gut, kann sein, dass das der Overkill ist... aber an und für sich funktioniert das.
     

Diese Seite empfehlen