CLI - Shell


© Mai 2021, Letzte Änderung 31.03.26

Übersicht

Ich habe lange darüber nachgedacht, wie man sich diesem Thema nähert
ohne gleich jemanden abzuschrecken.
Ich denke erst mit ein wenig praktischen Grundlagen und Lösungsansätzen anzufangen.
Wenn es nicht so läuft wie erwartet, hilft es meiner Meinung nach am Meisten.

Liste, für den Schnellzugriff

Die Liste ist mit Sicherheit nicht vollständig und ist mehr ein Index,
wo ich welchen Befehl einigermaßen beschrieben und verwendet habe.

Zum Anfang

Erste Schritte

Trotz aller Grafikoberflächen (GUI - graphical user interface) ist vieles unter Linux
im Terminal-Fenster, (also dem Command line Interface - CLI) eleganter lösbar.
Sogenannte "Headless"-Systeme, wie z.B. ein Datei- oder Web-Server
benötigen keine graphische Oberfläche, wollen aber trotzdem konfiguriert werden.
Dies geschieht häufig aus der Ferne (remote)
über eine verschlüsselte Verbindung (z.B. via ssh) mit einen Terminal.
Im Falle eines Terminals ist die Eingabe gewöhnlich die Tastatur
und die Ausgabe der Bildschirm. Das kann man aber alles nach belieben ändern.
Die Eingabe via Terminal enthält meist mehr Optionen als die Bedienung
über eine graphische Benutzeroberfläche,
welche teilweise remote, aus Sicherheitsgründen, nicht erreichbar ist.

Die Eingaben im Terminal oder Befehle eines Shell-Scripts werden
über einen als Shell bezeichneten Befehlsinterpreter abgearbeitet.
Die eine Shell gibt es im Grunde gar nicht, sondern verschiedene.
Diese Dialekte sind aber, wenn ich Debian verwende, nicht so wichtig,
da als Standard die bash-Shell eingestellt ist. Zsh, Fish, Dash und weitere haben jeweils unter 12% Verbreitung.
Über ein Terminal-Fenster kann ich im einfachsten Fall unter xfce über   Anwendungen > Terminal   aufrufen.
Es erscheint dann im Terminal-Fenster z.B. folgendes, welches aber auch beliebig geändert werden kann.

a1@desk3:~$

Der Aufbau ist z.B. wie folgt:   <Benutzername>@<Rechnername>:<Pfad>Promt
Also hier:

Mit   Ctrl-D   oder den Befehl   exit   schließe ich das Terminal-Fenster wieder.
Mit   exit   verlasse ich auch den Benutzer z.B. auf einem remote eingeloggten Rechner.

Am Anfang macht es Sinn sich ein paar Befehle zusammen zu kopieren oder
nach erfolgreicher Ausführung zu kopieren.
Bitte aber daran denke, nicht jeden Code aus dem Internet einfach zu kopieren.
Stattdessen macht es vor Verwendung Sinn, die Funktion zu verstehen und deren Konsequenzen zu kennen.
Da   Ctrl-C   in vielen Fällen für Abbruch steht, steht zum Kopieren vom Terminal   Ctrl-Shift-C  
und zum Einfügen ins Terminal   Ctrl-Shift-V   zur Verfügung.

Fast alles was ich eingebe wird gespeichert und läßt sich mit der Hoch ↑-Taste wieder hervor holen.
Beispielsweise sehen die vergangenen Eingaben wie folgt aus und
dummerweise habe ich bei der 209'ten Eingabe nicht aufgepasst und das Passwort mit eingegeben.
Da die Shell ergänzen kann, kann ich z.B.   his gefolgt von TAB   eingeben und erhalte   history.
Diese Ergänzung funktioniert z.B. auch bei Datei-Pfaden, sofern es eindeutig ist.

history 7                 zeige die letzten 7 Eingaben
  204  sudo /usr/sbin/fdisk -l
  205  sudo apt update
  206  sudo apt upgrade
  207  exit
  208  ssh -X m@n11.fritz.box
  209  su geheim
  210  history 7

history -d 209            löscht den unerwünschten Eintrag

!205                      zum gezielten Aufruf vergangenes
sudo apt update
…

!206
sudo apt upgrade
…

 ls -la                   das erste Leerzeichen vor ls bewirkt keine Aufnahme
insgesamt 680
drwx------ 11 a1   a1     4096 14. Apr 22:57 .
drwxr-xr-x  6 root root   4096  5. Okt 2025  ..
lrwxrwxrwx  1 a1   a1       12 11. Okt 2025  a0 -> /mnt/sda3/a0
-rw-------  1 a1   a1     4097 13. Apr 23:00 .bash_history
-rw-r--r--  1 a1   a1      220  5. Okt 2025  .bash_logout
-rw-r--r--  1 a1   a1     3526  5. Okt 2025  .bashrc
…

history 4                 zeige die letzten 4 Eingaben
  209  history 7
  220  sudo apt update
  221  sudo apt upgrade
  222  history 4          ls -la fehlt

Ich persönlich kann am besten lernen, indem ich versuche konkrete Beispiele nachzuvollziehen.
Daher habe ich versucht immer Beispiele zu finden.

Wie im obigen Beispiel erkennbar, befindet sich die Geschichte aller Eingaben und der Konfiguration
in Dateien, welche im Verzeichnis des Benutzers sind.

cat ~/.bash_history       hier finde ich die letzten Eingaben 
…                         nach dem Schließen des Terminals

nano ~/.bashrc            die Konfiguration
…

Als normal sterblicher Benutzer sollte ich nicht jeden Befehl aufrufen und nicht auf jeden Bereich zugreifen.
Das ist dafür um mich selbst vor Schaden zu bewahren.
Der Benutzer   root   darf jedoch alles und ist Systemadministratoren vorbehalten.
Entsprechend ist bei dem Passwort und bei der Benutzung Vorsicht geboten.
Um den "Super user" Status zu erhalten sind die Befehle   su   und   sudo   gedacht.

Weiterführendes

wilivm.com   Linux-History-Befehl
alexhost.com   Der Befehl history in Linux (Bash History)
debian-handbook.info   8.6. Shell-Umgebung

Zum Anfang

Pipelines

Ein- Ausgabe-Umleitung

Anbei ein paar konkrete Beispiele wie Datenströme umgeleitet werden können
oder wie Befehle aneinandergereiht werden können.

cd nichtVorhanden/ || cd Downloads/       cd - change directory mit alternativen Befehl 
bash: cd: nichtVorhanden/: No such file or directory

pwd                                       pwd - print working directory zur Überprüfung
/home/a1/Downloads ~/Downloads war der richtige Ordner

ls -la                                   ls - listet Dateien mit extra Parameter "la" = long-list + all
total 20
drwxr-xr-x 2 a1 a 4096 May 13 17:59 .
drwxr-xr-x 4 a1 a 16384 May 13 17:59 ..   zuzeit leerer Ordner, input.txt existiert noch nicht

sha256sum input.txt 2> check.txt         Fehlermeldungen in die Datei check.txt schreiben.
md5sum input.txt 2>> check.txt           weil input.txt noch nicht existiert

cat check.txt                           Ausgabe der Fehlermeldungen
sha256sum: input.txt: Datei oder Verzeichnis nicht gefunden
md5sum: input.txt: Datei oder Verzeichnis nicht gefunden

ls > input.txt                         Bildschirmausgabe umleiten, dabei Datei input.txt neu erzeugen.
                                      interessanterweise wird input.txt angelegt und dann ls ausgeführt
cat input.txt                         cat - concatenate; Inhalt der Datei ausgeben
check.txt
input.txt
                                      Dateiliste erzeugen | filtern > Ausgabe überschreibend in Datei input.txt
ls -la | grep "txt" > input.txt       aus Dateiliste Zeilen raussuchen, welche "txt" enthalten

cat input.txt                         vorheriger Inhalt ist überschrieben
-rw-r--r-- 1 a1 a 48 May 13 21:45 check.txt
-rw-r--r-- 1 a1 a 0 May 14 02:06 input.txt

md5sum input.txt 2> check.txt           da input.txt existiert, gibt nun eine Checksumme auf dem Bildschirm
177727ddd4b735ec4f43cc601433812a input.txt

cat check.txt                         da der 2. Fall fehlerfrei ist, ist check.txt nun leer

echo "ls -l" > input.txt; ls -l >> input.txt

cat input.txt
ls -l                               erst den Befehl
insgesamt 4                         dann das Ergebnis angehängt
-rw-r--r-- 1 m m 0 6. Apr 20:21 check.txt
-rw-r--r-- 1 m m 6 6. Apr 20:27 input.txt

sort < input.txt                     sortiert die Zeilen aus input.txt
insgesamt 4
ls -l
-rw-r--r-- 1 m m 0 6. Apr 20:21 check.txt
-rw-r--r-- 1 m m 6 6. Apr 20:27 input.txt
 

Und noch weitere Beispiele:

su
apt update && apt upgrade             wenn update Fehlerfrei, dann Fortsetzung mit upgrade

zip zipped.zip check.txt & nano       während er zippt, wird der Editor geöffnet

dd if=/dev/urand of=/dev/null & top   parallele Ausführung

chown a:a input.txt ; chmod 664 check.txt   sequentielle Ausführung

Zum Anfang

man - Manual

Wenn man eine Beschreibung benötigt, hilft in den meisten Fällen man weiter.
Einen Einstieg (zum Paket Ersteller ;-) findet man auch auf   debian.org
Dem Rest ist wahrscheinlich schon das   debiananwenderhandbuch.de   harte Kost.
Ein paar Grundlagen zur Konsole findet man unter   debian.org

Da Debian häufig Grundlage von anderen Linux-Derivaten ist, kann ich auf eine Fülle von Hilfen zugreifen.
Hier nur eine kleine Auswahl in alphabetischer Reihenfolge.

Als Ergänzung kann man noch  tldr  installieren und steht für 'Too Long; Didn’t Read'.
Hier findet man konkrete Beispiele. Siehe  tldr.sh.

sudo apt search tldr
tealdeer/stable 1.7.2-1+deb13u1 amd64
  simplified, example based and community-driven man pages…

sudo apt install tealdeer

tldr -v
tealdeer 1.7.2
tldr --update
Successfully created cache directory path `/home/a1/.cache/tealdeer`.
Successfully updated cache.

tldr -l > list                    Erstellt Liste der beschriebenen Befehle

tldr apt search
Warning: Page `apt-search` not found in cache.
Try updating with `tldr --update`, or submit a pull request to:
https://github.com/tldr-pages/tldr

Da es unter DEB 13 allerdings noch eine ältere Version ist und es ein relativ junges Projekt ist,
ist es zur Zeit noch lange nicht vollständig.
Alternativ gibt es noch eine Web-basierte Version  tldr.inbrowser.app.
Und Mitarbeit ist natürlich stets willkommen auf dem von Microsoft gekauften  github.com.

Zum Anfang

whereis - wo befindet sich die Funktion?

Manchmal kann es vorkommen dass man einen Befehl eingibt, er aber nicht gefunden wird.
Dann ist es nötig den kompletten Pfad einzugeben, den man wie folgt heraus bekommt.

fdisk
bash: fdisk: Kommando nicht gefunden.
whereis fdisk
fdisk: /usr/sbin/fdisk /usr/share/man/man8/fdisk.8.gz
sudo /usr/sbin/fdisk -l

Zum Anfang

uname - OS-Info

Speziell bei der Virtualisierung wird man gefragt welches Betriebssystem verwendet wird,
um Optimierungen durchführen zu können.

name -a
Linux desk3 6.12.73+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.73-1 (2026-02-17) x86_64 GNU/Linux
uname -m                    amd64 = 64 Bit Architektur
x86_64
uname -r                    zeigt die Kernel-Version 
6.12.73+deb13-amd64
uname -v                    Kernel-Version etwas detaillierter
#1 SMP PREEMPT_DYNAMIC Debian 6.12.73-1 (2026-02-17)

Beim Parameter -a sehe ich alles.
Hätte da statt 'amd64' z.B. '386/486' gestanden, hätte das auf einen 32 bit Kernel hingewiesen.

Zum Anfang

sh - shell

Die Befehle, welche ich direkt ins Terminal eingebe, kann ich auch in eine Text-Datei schreiben.
Damit die Datei der richtigen Shell zugeordnet wird, schreibe ich in die erste Zeile einen bestimmtem Kommentar.
Um aus der Text-Datei einen ausführbaren Befehl zu generieren kann ich ein bestimmtes Flag setzen.
Als Alternative kann ich den Befehl  sh  für die Bourne shell verwenden.
Bei DEB hat man den Uralt-Standard Bourne shell ersetzt durch die  dash  Debain Almquist Shell.

sh b_a0.sh                    start über sh 
ich wurde gestartet um
 2026-06-06 17:09:35 
cat b_a0.sh                   Inhalt der Test-Datei
#!/bin/sh
DATUM=`date "+%F %T"`
echo "ich wurde gestartet um\n $DATUM "

ls -la b_*                    Rechte der Datei
-rw-rw-r-- 1 a1 a1 73  6. Jun 17:09 b_a0.sh
chmod u+x b_a0.sh             gibt Benutzer der Datei Rechte zum Ausführen
ls -la b_*
-rwxrw-r-- 1 a1 a1 73  6. Jun 17:09 b_a0.sh

./b_a0.sh                     Aufruf ohne sh
ich wurde gestartet um
 2026-06-06 17:16:07 

Bin ich im Thunar, kann ich auch mit rechter Maustaste   Eigenschaften > Zugriffrechte   wählen.
Über eine Checkbox kann ich dann die Ausführung erlauben. Die Ausführung an sich, ist via Thunar nicht möglich.
Ein Doppelklick öffnet aus Sicherheitsgründen nur den Editor Mousepad.
Wer dennoch eine riskante Lösung sucht, findet sie unter  xfce.org.

make file excecutable

Zum Anfang

xargs - excecute commands

xargs  eigent sich besonders wenn man einen bestimmten Befehl mehrere Male (je Zeile) aufrufen möchte.

grep -rw sc/* -e id= > id_list             erzeugt eine Liste mit Dateien, wo id= enthalten ist
…
sc/android/stockROM/vorinstalliert.html:

Bereits installierte Programme auf einem Zenfone 4 Max

Zum Anfang

systemctl -

Zum Anfang

journalctl -

Zum Anfang

service -

Zum Anfang

nano input.txt                         nano - kleiner Editor
eazy*                                         Ctrl-O speichert Datei, Ctrl-X beendet nano

li -la < input.txt


dd if=~/Downloadds/debian.iso count=512 >> check.txt

smartctl -i /dev/sda                   bis deb 9
bash: smartctl: command not found      ab deb 10

whereis smartctl                       ab deb 10
smartctl: /usr/sbin/smartctl /usr/share/man/man8/smartctl.8.gz


apt-file search "/netstat "
munin-plugins-core: /usr/share/munin/plugins/netstat  
net-tools: /bin/netstat                               das scheint das Gesuchte zu sein
recap: /usr/lib/recap/core/netstat

apt-get install net-tools

Zum Anfang

Quellen

helmbold.de   Linux auf einem Blatt
archlinux.de   Shell-Spickzettel
bitblokes.de   Bash: Zeichen aus Zeichenkette (String)
bitblokes.de   Malware: Befehle von Websites kopieren und dann im Terminal einfügen
  ist keine gute Idee
profi-tutorials.de   Eingabe- / Ausgabe-Umleitungen (I/O-Redirections)
manurevah.com   basic commands

Zum Anfang