Ich habe schon einige kleine Blog-Beiträge zum Thema “Shell / Bash” geschrieben und werde versuchen diese Blog-Beiträge zu einer hoffentlich umfassenden Einführung in das Thema Shell zusammenfassen… :-)
Was ist eine Shell?
Die Shell ist die Eingabe-Schnittstelle zwischen Computer und Benutzer, welche bei normaler Systemkonfiguration nach dem erfolgreichem Login eines Benutzers gestartet wird, so dass man auf dieser Kommandozeile die Möglichkeit hat weitere Programme zu starten. Die Shell könnte man somit aus Arbeitsumgebung bezeichnen, von wo aus der PC gesteuert werden kann bzw. Dateien bearbeitet werden können. Es gibt unterschiedliche Arten von Shell’s, wer ein modernes Linux-Betriebssystem (Debian, Ubuntu…) installiert, landet meistens in der sogenannten “bash“, darauf gehe ich jedoch gleich genauer ein. Die eingegebenen Texteingaben werden von der Shell interpretiert und ausgeführt, daher spricht man bei der Shell auch von einem Kommandozeileninterpreter (command-line interpreter, CLI).
Begrifflichkeiten!?
In Verbindung mit dem Begriff Shell hört man auch immer wieder folgendes …
- Konsole: In ihrem ursprünglicher Definition war die Konsole ein Terminal, mit dem der Systemoperator die Systemfunktionen steuern konnte… heute wird der Begriff jedoch ebenfalls für “Terminalemulation” verwendet, zudem heißt die grafischen Terminalemulationen unter KDE “Konsole“.
- Virtuelle Konsole: Die meisten Linux-Systeme kommen standardmäßig mit einigen virtuellen Konsolen daher, welche man über <Strg> + <Alt> + <F1> bis <F6> erreichen kann. Mittels <Strg> + <Alt> + <F7> wird der Desktop und somit die graphischen Oberfläche wieder angezeigt.
- Terminal: Ein Terminal ist ein Computer, der den Zugriff auf einen entfernten Rechner erhält und die meisten Rechenoperationen somit nicht selber durchführt. (Terminal-PCs) Der Begriff “Terminal” wird heute jedoch auch als Abkürzung für “Terminalemulation” verwendet.
- Terminalemulation: Mit einer Terminalemulation wird eine textorientierte Ein- und Ausgabeschnittstelle, ein Terminal emuliert, so dass man mehrer Instanzen eines Terminals auf dem Desktop zur Verfügung hat.
shell <---> Terminalemulation <---> grafische Oberfläche bash <---> xterm <---> X11
Wie komme ich in die Shell?
Wie bereits erwähnt kann man zum einen die virtuelle Konsolen, die mit tty bezeichnet werden per Tastenkombination erreichen. Die Abkürzung tty stammt von dem englischen Wort Teletype und wurde historisch bedingt von Unix übernommen. Mittels …
<Strg> + <Alt> + <F1>
… gelangt man in die erste der tty-Konsolen, in diesem Fall tty1.
Hat man sich einmal an die Desktop-Oberfläche gewöhnt, erscheinen einem diese virtuelle Konsolen meist wenig komfortabel, daher gibt es einige Programme (Terminalemulation) welche den Funktionsumfang erheblich erweitern.
KDE – Konsole
KDE-Nutzern steht das bereits erwähnte Programm “Konsole” zur Verfügung, wobei sich der Kreis der Begrifflichkeiten hier schließt und die Verwirrung bei so manchen gerade erst einsetzt. ;-) Lässt man dies außer Acht ist dieses Terminal(emulation) sehr gut. Das Programm unterstützt Tabs, Transparenz, verschiedenste Farbschema, unterschiedliche Schriften und man kann Profile anlegen.
Gnome – Terminal
Gnome-Nutzer verfügen von Haus aus über ein Programm mit dem Namen “Gnome-Terminal”. Ich persönlich bevorzuge dieses Programm, wobei dies wahrscheinlich eine Übungssache ist…
TASTENKÜRZEL | BEDEUTUNG |
---|---|
<Strg> + <Umschalttaste> + t | öffnet einen neuen Tab |
<Strg> + d | schließt einen Tab |
<Strg> + Bild rauf | öffnet nächsten Tab (rechts) bzw. den ersten |
<Strg> + Bild runter | öffnet vorherigen Tab (links) bzw. den letzen |
<Strg> + <Umschalttaste> + Bild rauf | verschiebt einen Tab nach rechts |
<Strg> + <Umschalttaste> + Bild unter | verschiebt einen Tab nach links |
Xterm
Xterm ist Bestandteil des X.org Projekts und war lange Zeit das Standardterminal für Linuxsysteme mit grafischer Oberfläche.
CLI Companion
Wer die Linux-Befehle noch lernen möchte oder sich einige komplizierte Behle öfter benötigt, kann sich auch dieses Terminal anschauen. -> cli-companion-die-gui-in-der-konsole
Terminator
“Terminator ist ein in Python geschriebener Terminal-Emulator für die Desktop-Umgebung GNOME, der es ermöglicht mehrere Terminals innerhalb eines Fensters bzw. einzelner Tabs zu benutzen und mittels Tastatur-Kürzeln zwischen diesen zu wechseln. So kann man ohne Tabs und ohne weitere Terminalfenster mehrere Shells zur selben Zeit offen haben.” – http://wiki.ubuntuusers.de/Terminator
Wenn man seine Standard-Terminal ändern möchte, kann man dies mit dem Alternativen-System bewerkstelligen…
sudo update-alternatives --config x-terminal-emulator
Was für Shells gibt es?
Wenn man sich ein wenig näher mit dem Thema beschäftigt, stellt man schnell fest, dass es eine Menge Alternative Shells gibt. Ich beschränke mich einfach mal auf die (heutige) Standard-Shell die bash und einer Alternative der zsh (Z-Shell)
Bourne Again Shell (bash)
Die Bourne Again Shell ist die Standard-Shell der meisten Linux-Distributionen. Die Shell beherrscht die Features der Borune- Korn- und C-Shell. Redet jemand von einer Shell, spricht man meistens von Bash. Um das volle Potenzial der Bash zu nutzen sollte man sich “.bashrc“-Datei anschauen und an seine Bedürfnisse anpassen, für den Anfang sollte meine Datei als Vorlage genügen. -> bashrc
Z-Shell (zsh)
Die Zsh kann man als eine Zusammenstellung aller Verbesserungen und Features aus der bash, der csh und der tcsh betrachten.
Zu einigen ihrer Features zählen:
- eine frei programmierbare Wortvervollständigung (TAB-Completion)
- die Möglichkeit, die History aus anderen – gleichzeitig laufenden – Shells zu nutzen
- Rechtschreibüberprüfung
- nahezu vollständige Kompatibilität zur bash, ksh und tcsh
- …
-> Quelle: http://de.wikipedia.org/wiki/Unix-Shell#Die_Z-Shell
Bei der Z-Shell kann hat man noch viel mehr Einstellungsmöglichkeiten, welche einem Anfangs ggf. überfordern können, daher auch hier meine “.zshrc“-Datei als Vorlage. -> zshrc
Z-Shell installieren:
sudo aptitude install zsh
Z-Shell ausprobieren:
zsh
Standardmäßig die Z-Shell verwenden:
sudo chsh -s /usr/bin/zsh `whoami`
Probieren geht über studieren…
… was ist damit sagen will, wer einmal die Vorteile der Shell erkannt hat und einige Befehle kennt, wird die Shell lieben lernen!
Linux-Dateipfade einigermaßen kennen
Auch wenn in der Shell meist angezeigt wird in welchem Verzeichnis man sich gerade befindet, kann es seht hilfreich sein, wenn man ungefähr weiß wo sich was bei Linux befindet! -> http://wiki.ubuntuusers.de/Verzeichnisstruktur
Verzeichnis | Bedeutung | ~ Windows |
---|---|---|
/ |
Wurzelverzeichnis |
C:\ |
/boot |
Bootloader |
C:\ |
/etc |
Systemkonfiguration | registry,
C:\WINDOWS\*.ini |
/bin |
Systemprogramme für Benutzer |
C:\WINDOWS\,C:\WINDOWS\COMMAND\ |
/sbin |
Systemprogramme und -dienste für Admins | |
/lib |
Systembibliotheken und Treiber |
C:\WINDOWS\SYSTEM32\ |
/tmp |
Temporäre Dateien |
C:\WINDOWS\TEMP\ |
/usr |
(“Unix System Resources”) | |
/usr/bin |
Programme für Benutzer |
C:\Programme\*\ |
/usr/sbin |
Programme und Dienste für Admins | |
/usr/lib |
Bibliotheken | |
/home |
Heimatverzeichnisse |
C:\Dokumente und Einstellungen\ |
/home/user |
Heimatverzeichnis des Benutzers user | |
/root |
Heimatverzeichnis des Benutzers root | |
/var |
Daten von Diensten | |
/var/log |
Systemprotokolle | |
/media |
Wechseldatenträger, z.B. USB-Stick | |
/media/cdrom |
CD-ROM |
A:\, D:\, E:\,... |
Beim Login in die Shell, landet man meistens in seinem eigenen home-Verzeichnis (z.B.: /home/lars/). Im “Prompt” (dem Text vor der Eingabeaufforderung, in der Shell) könnte nun so etwas angezeigt werden “lars@ubuntu:~$“.
lars ist hier der User-Name, ubuntu der Name des PCs und das ~ (Tilde-Zeichen) steht als Abkürzung und Synonym für das Homeverzeichnis, in welchem wir uns gerade befinden, dies kannst du gleich durch die Eingabe des Befehl “pwd” (print working directory) überprüfen. ;-)
Groß- und Kleinschreibung beachten
Anders als bei Windows unterscheidet Linux Groß- und Kleinschreibung, hier einige Beispiele zur Verdeutlichung …
mkdir lall
(mkdir – make directories)
mkdir Lall
touch lall
(touch – erstellt eine leere Datei)
touch Lall
Nun können wir uns mittels “ls” (ls – list directory contents) bzw. …
ls -latrF --color=auto
… anzeigen lassen, welche Dateien / Verzeichnisse im aktuellen Verzeichnis erstellt wurden. Mittels “rm” bzw. “rmdir” kannst du diese Dateien wieder löschen. Falls du versehentlich z.B.: “touch ./–help” ausführst und somit eine leere Datei mit dem Namen-“–help” erstellt hast, kannst du diese mittels “rm ./–help” wieder entfernen.
Die Navigation
Ebenfalls ein sehr großes Themenfeld ist die Navigation in der Shell, angefangen von der Navigation durch die Verzeichnisse / Dateien … über die Verwendung der History (bereits eingegebene Befehle in der Shell) … bis hin zur Navigation innerhalb der Shell.
Navigation in Verzeichnissen
Befehl | BEDEUTUNG |
---|---|
cd .. |
wechselt ein Verzeichnis nach oben |
cd ../.. |
wechselt zwei Verzeichnise nach oben |
cd ~ |
wechselt in dein home-Verzeichnis |
TAB |
durch das drücken der Tabulator-Taste, wird deine Eingabe vervollständigt -> ggf. 2x hintereinander TAB drücken !!! |
».« |
jedes Verzeichnis enthält eine Referenz auf sich selbst, diesen Punkt benötigt man vor allem,wenn man eine ausführbare Datei starten möchte… (z.b: cd /bin/; ./bash;) |
pwd |
zeigt an wo du dich befindest |
Navigation in der Shell
BEFEHL / Tastenkürzel | BEDEUTUNG |
---|---|
<Strg> + d |
Logout aus der Shell (logout bzw. exit) |
<Strg> + c |
laufender Prozesse (im Vordergrund) wird beendet |
<Strg> + l |
räumt die Ausgabe auf (clear) |
fc -l |
zeigt die letzten Befehle in einer Liste an |
Pfeiltasten (noch oben / unten) |
letzte Befehle durchblättern |
Pfeiltasten (noch rechts / links) |
Cursor auf der Konsole (rechts / links) bewegen |
<Strg> + r |
sucht einen Befehl in der Bash-History (mehrmaliges drücken von Strg+r geht weiter in der History zurück) |
Alt + . |
schreibt den letzten Parameter des letzen Befehls auf die Konsole |
!$ |
schreibt den letzten Parameter des letzen Befehls auf die Konsole (Alt + .) |
!! |
führt den letzten Befehl noch einmal aus |
!string |
startet den letzten Befehl, der mit sting anfängt |
!?string |
startet den letzten Befehl, der string enthält |
^sting1^string2 |
wiederholt den letzten Befehl, wobei sting1 doch string2 ersetzt wird |
<Strg> + a |
Cursor am Anfang der Zeile |
<Strg> + e |
Cursor am Ende der Zeile |
<Strg> + w |
schneidet das letzte Wort aus |
<Strg> + u |
scheidet alles vor dem Cursor aus |
<Strg> + k |
scheidet alles hinter dem Cursor aus |
<Strg> + y |
fügt die zuletzt ausgeschnittenen Daten ein |
PS: wie bereits erwähnt entfaltet die Shell ihr volles Potenzial erst, wenn man diese ein wenig an seine Wünsche anpasst, daher hier noch einmal der Verweiß auf die .bashrc und .zshrc …
Kommandos hintereinander ausführen
Wie bereits kurz zuvor gezeigt, kann man Befehle auch hintereinander ausführen… z.B.:
cd /bin/; ./bash;
Hier werden die Befehle “cd /bin/” und “./bash” einfach nacheinander ausgeführt. Wenn man den zweiten Befehl jedoch nur ausführen möchte, wenn der erste Befehl ohne Probleme funktioniert hat, kann man && zwischen den beiden Befehlen verwenden… z.B.:
cd /bin_lall/ && ./bash;
Und wenn man den zweiten Befehl nur ausführen möchte, wenn der erste Befehl nicht funktioniert hat, nimmt man “||“… z.B.:
cd /bin_lall/ || echo "ggf. existiert /bin_lall nicht";
PS: Natürlich muss man nicht jedesmal in das Verzeichnis /bin wechseln, wenn man ein Programm aus diesem Verzeichnis öffnen möchte, dazu wird in der Shell die Variable “$PATH” verwendet. z.B.:
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
Mehrzeilige Kommandos
Wenn man ein Kommando / Befehl über mehrere Zeilen aufteilen möchte, kann man dies mithilfe von “\” machen… z.B.:
find /etc/ \
-iname "pass*"
Syntax | Name | Beschreibung | ~ Windows |
---|---|---|---|
pwd |
present working directory | Anzeige des aktuellen Arbeitsverz. | |
cd Zielverzeichnis |
change directory | Verzeichniswechsel |
CD |
ls Verzeichnis |
list | Verzeichnisinhalt anzeigen |
DIR |
file Datei |
% | Dateiformat oder -typ | |
echo Zeichenkette |
% | Zeichenkette ausgeben | |
cat Datei |
concatenate | Dateiinhalt ausgeben |
TYPE |
more Datei |
% | dito, seitenweise |
MORE |
less Datei |
% | dito, blättern und suchen | |
touch Datei |
% | Leere Datei anlegen | |
cp Quelle Ziel |
copy | kopieren |
COPY |
mv Quelle Ziel |
move | verschieben, umbenennen |
MOVE, REN |
rm Datei |
remove | löscht eine Datei |
DEL, ERASE |
mkdir Verzeichnis |
make directory | neues Verzeichnis anlegen |
MD |
rmdir Verzeichnis |
remove directory | (leeres) Verzeichnis löschen |
RD |
-> linux-kommandos-als-hintergrundbild ;-)
Dateien bearbeiten
Wer direkt in der Shell Dateien verändern möchte, sollte sich den “vim”-Editor anschauen, wie die Shell ist dieser Editor gewöhnungsbedürftig aber man gewinnt Ihn mit der Zeit lieb… ;-) In diesem HowTo habe ich versucht die wichtigsten Funktionen von vim zusammenzufassen. Und hier noch eine Schnellübersicht:
BEFEHL / TASTENKÜRZEL | BEDEUTUNG |
---|---|
i | Text einfügen, vor dem Cursor |
R | Text ab Cursor-Position überschreiben |
<Strg> + v | Bereich markieren |
<ESC> | Bearbeitungsmodus beenden |
y | kopieren |
p | einfügen |
:q | vi/vim beenden |
:w | Datei speichern |
Es gibt unter Linux noch etliche Programme, welche einem beim bearbeiten von Dateien hilfreich sein können z.B.: sed
sed -i 's/Ubuntu/Windows/g' test.txt
Dieser Befehl ersetzt das Wort “Ubuntu” durch “Windows” in der ganzen Datei “test.txt” im aktuellen Verzeichnis. Weitere Infos zu sed findest du hier -> streameditor-sed und hier noch ein alter Beitrag zum Thema -> Dateien-in-der-shell-bearbeiten
Programme im Hintergrund verschieben
Man kann Programme und Befehle auch im Hintergrund ausführen bzw. diese in den Hintergrund verschieben…
lars@ubuntu ~$ kommando1 &
[1] 5520
lars@ubuntu ~$ kommando2 &
[2] 5521
lars@ubuntu ~$ fg %2
kommando2
kommando1 und kommando2 wurden beide im Hintergrund ausgeführt, dann wurde kommando2 mittels dem Befehl “fg” wieder in den Vordergrund geholt. Wenn man kommando2 wieder in den Hintergrund verschieben möchte drücken wir: <Strg> + z
[2]+ Stopped kommando2
lars@ubuntu ~$ bg
[2]+ kommando2 &
Mit Hilfe des Befehls ”
bg"
wird eine angehaltener Job der Shell in den Hintergrund verschoben und wieder gestartet:
Hier gibt es diesbezüglich weitere Infos: Prozess-anhalten
StdIn & StdOut
Sehr hilfreich sind folgende kleine Helfer in der Shell -> Pipezeichen (|) Größer-als-Zeichen (>) und Kleiner-als-Zeichen (<)
mithilfe dieser Zeichen kann man Programm bzw. dessen Ausgaben umleiten. z.B.:
ls -l /usr/bin > /tmp/Alle_Benutzerprogramme.txt
-> schreibt die Ausgabe von “ls” des Verzeichnisses /usr/bin/ in die Textdatei /tmp/Alle_Benutzerprogramme.txt
grep http /etc/services | wc -l
-> zählt alle Zeilen in der Textdatei /etc/services, die die Zeichenkette http enthalten
Zum Schluss verlinke ich noch einige alte Blog-Post welche weitere Informationen zur Shell beinhalten, viel Spaß beim testen… :D
– Dateien verschieben in der Shell -> http://suckup.de/blog/2010/01/31/mv-linux/
– reguläre Ausdrücke (wildcards) in der Shell -> http://suckup.de/blog/2010/02/09/wildcards-in-der-shell/
– Shell-Programmierung: Schleifen -> http://suckup.de/blog/2010/02/09/nice-try/ + http://suckup.de/blog/2010/01/31/bash-programmierung-schleifen/
– Bedingungen in der Shell -> http://suckup.de/blog/2010/01/31/bedingungen-in-der-shell-linux/
– crontab -> http://suckup.de/blog/2010/02/08/crontab/
– ps – prozessstatus -> http://suckup.de/blog/2010/09/14/shell-ps-prozessstatus/
– Rechnen in der Shell -> http://suckup.de/blog/2010/01/31/rechnen-in-der-shell/
– HTML-Umlaute in der Shell korrigieren -> http://suckup.de/blog/2010/02/13/html-umlaute-korrigieren/
– cdrecord – ISO erstellen und CD brennen -> http://suckup.de/blog/2010/01/31/cdrecord-iso-erstellen-und-brennen/
– aptitude & dpkg -> http://suckup.de/blog/2010/02/13/aptitude-dpkg/
– Unix-Dateiattribute (Zugriffsrechte) verändern -> http://suckup.de/blog/2010/01/31/chmod-howto/
– su & sudo & Setuid-Bit -> http://suckup.de/blog/2010/02/08/su-sudo-setuid-bit/
– Systeminfos anzeigen -> http://suckup.de/blog/2010/02/08/systeminfos-anzeigen-lassen/
– Speicherverbrauch anzeigen -> http://suckup.de/blog/2010/02/08/speicherverbrauch-anzeigen-lassen/
– mount über SSH -> http://suckup.de/blog/2010/02/07/mount-ueber-ssh/
– Ports via ssh weiterleiten –> http://suckup.de/blog/2010/03/29/ports-via-ssh-weiterleiten/
– SSH – Hostnamen vervollständigen -> http://suckup.de/blog/2010/09/14/ssh-hostnamen-vervollstaendigen/
– Desktop Firewall – iptables -> http://suckup.de/blog/2010/01/31/desktop-firewall-iptables/
– deine öffentliche IP-Adresse in der Shell -> http://suckup.de/blog/2010/01/31/deine-oeffentliche-ip-adresse/
– offene Ports analysieren -> http://suckup.de/blog/2010/03/28/offene-ports-analysieren/
– TCPdump – HowTo -> http://suckup.de/blog/2010/08/02/tcpdump-howto/
– netstat + ss + lsof -> http://suckup.de/blog/2010/01/31/netstat-ss-lsof/
– nethogs und iftop – Traffic analysieren -> http://suckup.de/blog/2010/01/31/nethogs-und-iftop-traffic-analysieren/
– lsof – list open files -> http://suckup.de/blog/2010/02/22/lsof-list-open-files/