Nach einigen “Klickbunti”-Themen mal wieder ein kleiner Eintrag zur guten alten Shell ;-). Unter Linux kommt man ja fast nicht drum herum, mit dem Terminal und der Bash (Bourne-again shell) in Berührung zu kommen, deswegen ist man gut beraten, sich entsprechend zu wappnen. ;p Ein paar pfiffige Befehle, für das produktive Arbeiten mit der Bash, habe ich versucht hier zusammenzustellen…
Wer gerade erst mit Linux anfängt, sollte sich in jedem Fall einmal die Zeit nehmen, die Grundbefehle für die Shell zu lernen. Dazu gibt es viele gute Zusammenfassungen im Netz, z.B.
Auch mit einem Editor sollte man in der Konsole umgehen können, um Konfigurationsdateien anpassen zu können. Für Einsteiger bietet sich hier nano an, das bei den meisten Distributionen auch bereits vorinstalliert ist, für erfahrene Anwender gibt es jedoch noch sehr viel mächtigere Editoren wie z.B. vim. (siehe Tipps unten) Außerdem ist es sinnvoll, zu wissen wie die Verzeichnisstruktur unter Linux (Suchmaschine des Vertrauens hilft!) aufgebaut ist, um beispielsweise zu wissen, wo wichtige Dateien zu finden sind.
Als Anfänger tut man sich natürlich schwer, auf Anhieb die richtigen Befehle zu finden. Aber auch wenn man schon mehr Erfahrung hat, passiert es häufiger, dass man auf neue Befehle stößt. Einige Tipps, wie man sich trotzdem zurechtfindet:
Das Terminal hat zwar keine grafischen Effekte, dafür jedoch andere Vorteile. Diese liegen unter Anderem bei der einfachen Manipulation der Eingabe- und Ausgabekanäle. Natürlich ist es besonders effektiv, wenn man diese Vorteile gezielt einsetzt. Grob gesagt gibt es 3 Standardkanäle unter Linux für Eingabe & Ausgabe. Eingabe (“STDIN”, meist mit der Nummer 0 gekenntzeichnet), Ausgabe (“STDOUT”, Nummer 1) und Fehlerausgabe (“STDERR”, Nummer 2). Normalerweise gibt der Benutzer etwas über die “Standardeingabe” (einen Befehl) in das Terminal ein und bekommt eine Ausgabe oder einen Fehler zurückgeliefert. Das alleine wäre nichts besonders, allerdings lässt sich die Ausgabe auch über sogenannte Pipes - gekenntzeichnet durch einen senkrechten Strich | an den Eingabekanal eines anderen Befehls umleiten. So kann man Befehle unter Linux einfach verketten.
Drei kleine Beispiele:
ls | sort # gibt den Ordnerinhalt aus uns sortiert die Ausgabe alphabetisch
cat file.txt | grep apfel # gibt eine Datei aus und sucht dann nach dem Textausschnitt, der den Begriff "apfel" enthält
history | less # listet die zuletzt eingegebenen Befehle auf, mit less kann man komfortable in der Ausgabe scrollen oder suchen
Neben der “Pipe” gibt es auch noch andere Möglichkeiten, die Ausgabe umzuleiten. Zum Beispiel kann man mit dem Zeichen > auch Ausgaben in Dateien weiterleiten, wenn diese nicht direkt auf dem Bildschirm erscheinen sollen. So kann man z.B. auch Fehler in einer extra Datei sammeln, indem man die oben genannte Nummer der Fehlerausgabe benutzt:
CMD 2 > errors.txt
Der oben angesprochene history-Befehl zeigt vor jedem früheren Befehl eine Nummer an. Mit einem Ausrufezeichen und einer passenden Nummer kann man den Befehl so auch später erneut aufrufen und erspart sich unnötige Tipparbeit:
$ history | more 10 2011-04-20 10:37:42 sudo pacman -Syu 11 2011-04-20 11:04:06 ls 12 2011-04-20 11:04:18 cd tmp/ 13 2011-04-20 11:04:19 ls 14 2011-04-20 09:44:04 cd .config/autostart/ 15 2011-04-20 09:44:05 ls $ !12 cd tmp/
Auch kann man die letzen Eingaben relativ ansprechen, z.B.
!-3 # fuehrt den drittletzten Befehl aus
Speziell für den letzten Befehl gibt es das Kürzel !!, was z.B. besonders hilfreich ist, wenn man mal wieder vergessen hat, einen Systembefehl mit Rootrechten zu starten:
$ pacman -Syu error: you cannot perform this operation unless you are root. $ sudo !! sudo pacman -Syu Password:
mkdir newdir cd !!:1 # erstes Argument vom letzten befehl, wechselt in das neu erstelle Verzeichnis (alternativ "cd !$")
!ssh :p # letzten befehl zeigen, der ssh enthielt (ohne :p wird der Befehl direkt ausgeführt)
ls -la | # gesamten Ordnerinhalt auflisten, sollte den meisten bekannt sein ;) |
cd - | # zurück zum vorherigen Verzeichnis, vergleichbar mit dem Zürück-Button in Dateimanagern |
rm -Rf ordner | # löscht einen ordner komplett (rekursiv) & ohne nervige Fehler wie bei rmdir |
mkdir -p ~/neue/ordner/anlegen | # mit -p können direkt mehrere Unterordner in einem Schritt erstellt werden |
du / -h | more bzw. df -h | # zeigt Festplattenspeichernutzung bzw. freien Speicherplatz (-h --> human readable) |
tar cf dir.tar dir/ | Tar-Archiv aus Verzeichnis dir erstellen. (tar czf für tar.gz und cjf für tar.bz2) |
tar xvzf file.tar.gz | gzip tar Datei extrahieren (Dateiendung .tgz oder .tar.gz) |
tar xvjf file.tar.bz2 | bzip2 tar Datei extrahieren (Dateiendung .tbz oder .tar.bz2) |
Wildcards (erkennbar z.B. an dem Sternchen: *) werden verwendet, wenn bestimmte Buchstaben nicht klar festgelegt werden sollen. Mit ihnen ist es möglich, verschiedene Dateien auf einmal zu behandeln. Beispiele:
mv *.jpg ./Bilder | # alle jpg-Dateien in den Unterordner Bilder kopieren |
find -name *notizen* | # sucht nach einer Datei im aktuellen verzeichnis mit dem Begriff notizen im Namen, siehe auch: http://www.go2linux.org/usages-examples-of-find-command |
cp filename{,.bak} | # Datei filename einfach backupen |
Das Zeichen * steht für 0 bis beliebig viele Zeichen. Für nur ein beliebiges Zeichen, sollte ? verwendet werden. Natürlich ist es auch möglich, nur bestimmte Buchstaben zuzulassen. Siehe dazu z.B. http://www.tuxfiles.org/linuxhelp/wildcards.html.
Ein riesiger Vorteil beim Benutzen der Bash ist die Möglichkeit, mehrere Befehle mit Scripts zu automatisieren. Das verkleinern von vielen Bildern oder ein regelmäßig erstelltes Backup sind so sehr bequem möglich. Natürlich erhöht es auch die Produktivität stark, wenn man solche Scripts an den richtigen Stellen einsetzt. Zudem ist es für Jeden, der schonmal mit dem Terminal gearbeitet hat und bereits einige Befehle kennt, kein großer Schritt mehr, Shell-Scripting zu lernen. Gute Anlaufstellen sind beispielsweise:
Neben den Scripts gibt es auch noch andere Möglichkeiten, bei häufig benötigten Aktionen Zeit zu sparen. Befehle in der Datei .bashrc im Homeverzeichnis werden beispielsweise immer beim Starten der Shell ausgeführt. Hier bietet es sich an, für längere Befehle alias-Namen festzulegen. Beispiel:
alias la='ls -lahg --color=auto --group-directories-first'
Nun muss statt dem langen Befehl in den Anführungszeichen immer nur la eingegeben werden. Weitere nette Anregungen für die .bashrc findet man z.B. im Archlinux Forum oder im Ubuntu Forum.
vim ist ein sehr umfangreicher Texteditor für die Konsole, der durch eine angepasste Konfigurationsdatei sowie etliche Plugins noch erheblich erweitert werden kann. Da bei Linux öfter mal vorkommen kann, dass man Konfigurationsdateien anpassen muss, hier ein kurzer Überblick. Zum Einstieg ist es wichtig zu wissen, dass es im Wesentlichen 2 Modi gibt: einen Befehls-/Kommandomodus (in dem vim auch startet) zur Eingabe von Befehlen und einen Eingabemodus zur Textbearbeitung. Mit der Taste i wird standardmäßig in den Eingabemodus gewechselt, die Taste ESC bringt einen zurück in den Befehlsmodus.
Ein paar nützliche Befehle:
:q | vim beenden |
:q | Verlassen erzwingen (bei Änderungen ohne Speichern) |
:w | Änderungen in Datei schreiben |
:wq oder :x | Speichern und Verlassen kombinieren |
/suche | nach dem string "suche" im dokument suchen |
:/s/foo/bar | nach foo suchen und mit bar ersetzen (erstes Ergebnis) |
:%s/foo/bar | im Dokument nach foo suchen und mit bar ersetzen (alle Ergebnisse) |
n | Weitersuchen (nächstes Ergebnis) |
u | vorige Schritte rückgängig machen |
b oder w | ein Wort vor oder weiter springen |
D | vom Cursor bis zum Ende der Zeile alles ausschneiden |
p | Text aus Zwischenablage einfügen |
v | Text markieren (erneutes v beendet Markieren) |
y | Text kopieren |
dd | aktuelle Zeile löschen |
G | zum Ende des Dokumentes springen |
gg | ganz zum Anfang eines Dokuments springen |
Für die aktuelle Datei fehlen die nötigen Schreibrechte:
:shell # wechseln in die Shell, ohne vim zu beenden
chmod u+w filename.txt # gibt dem aktuellen benutzer Schreibrechte
exit # kehrt zu vim zurück
:w! # Dateiänderungen speichern
Für die Aktuelle Datei fehlen die Rootrechte (Konfigurationsdateien usw.):
:w !sudo tee %
(tee schreibt standardausgabe in eine datei, in diesem Fall die aktuelle (%), alternativ kann nach dem tee befehl natürlich auch ein anderer Befehl angegeben werden)
Weiterführendes zu vim:
Viele Fehler, die einem bei der Shell-Benutzung über den Weg laufen, sind die Ursache ähnlicher Fehlerquellen und deswegen oft einfach lösbar. Generell empfiehlt es sich (sofern im Terminal keine Fehlermeldung aufgetaucht ist), einmal in den Logfiles (i.d.R. zu finden im Verzeichnis /log), z.B. in Kombination mit dem grep-Befehl nachzusehen. Für ehemalige Windows-Nutzer ist wahrscheinlich das Rechtesystem erst einmal ungewohnt:
chmod u+rwx file # dem benutzer Lese (r) Schreib (w) und Ausführungsrechte (x) für die Datei file geben
chown und chgrp # Besitzer und Gruppe einer Datei festlegen
su user # als benutzer user anmelden. su ohne Parameter gibt dauerhafte Rootrechte
Programme kann man auf verschiedene Weise zum Beenden zwingen:
pkill -f programm # versucht "programm" zu beenden
Falls mehrere Instanzen eines Programmes laufen, lassen sich auch alle aufeinmal beenden mit:
killall programm
Erweiterte Kontrolle über das gewünschte Signal, das zum Beenden gesendet wird bekomt man mit dem kill-Befehl. (siehe man kill) Hier muss allerdings auch erst z.B. mittels ps -ax | grep programm nach der richtigen Processid gesucht werden, Beispiel:
kill -9 ID
Um den Artikel möglichst allgemeingültig zu halten, habe ich mich bemüht, hier nur die “Standardbefehle” zu erwähnen. Natütlich gibt es noch etliche gute Bash-Tools, die die Produktivität nochmal verbessern. Statt der normalen Systemüberwachung top benutze ich z.B. htop, welches mehr Funktionen bietet. Für Systemtools gibt es bereits einen guten Blogartikel, welchen ich hier gerne verlinke: http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html.
Ich hoffe die Tipps in diesem Artikel kann dem Einen oder Anderen die Arbeit in der Bash erleichtern. ;) Wie immer freue ich mich über Kommentare: Gibt es noch Befehle oder Tricks, die ihr weiterempfehlen könnt oder für erwähnenswert haltet?