shell: erste Schritte: Dateien und Operatoren (1)

17 November 2022

Grundsätzliches

Alles ist eine Datei! (Oder auch Dateideskriptor, oder Bytestrom)

"[…​] Ein-/Ausgabe-Ressourcen wie Dateien, Verzeichnisse, Geräte (z. B. Festplatten, Tastaturen, Drucker) und sogar Interprozess- und Netzwerk-Verbindungen […​]"

https://de.wikipedia.org/wiki/Everything_is_a_file

typische shell-Befehle

Befehl Beschreibung

ls

list directory

echo

display a line of text

cat

concatenate files and print on the standard output

grep

print lines that match patterns

…​

siehe /bin/* und /usr/bin/

Datenströme der Shell: stdin, stdout, stderr

  • stdin(0): Standard-Eingabe

  • stdout(1): Standard-Ausgabe

  • stderr(2): Standard-Fehler

  • (selbstdefiniert)

# ls -la /dev/std*

lrwxrwxrwx 1 root root 15 Okt 25 17:41 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Okt 25 17:41 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Okt 25 17:41 /dev/stdout -> /proc/self/fd/1

Beispiel: Vergleich stdout mit stderr

# ls datei.txt
# ls datei2.txt

Operatoren

Operator Beschreibung

>

Umleitung der Standardausgabe in eine Datei

>>

Umleitung in eine Datei, hängt Ausgabe an eine bereits bestehende Datei

|

Pipe. Ausgabe eines Kommandos als Eingabe zu einem Anderen

<

Statt von der Standardeingabe (Tastatur) wird aus einer Datei gelesen

&

Umleitung in anderen File Discriptor

Beispiele

# Beispiel 1 "Hello World"
echo "hallo"

echo "hallo" > datei.txt

# Beispiel 2
echo "hallo in der zweiten Zeile" >> datei.txt

# Beispiel 3: zeilenweise(!) filtern
cat [dateiname] |grep [suchmuster]
cat datei.txt |grep "hallo"

# Aufgabe: was passiert?
cat datei4711.txt |grep 123
# ls schreibt nach stdout UND stderr -> grep liest nur stdin -> Fehlermedlung von ls landet auf Konsole

# Beispiel 4: verketten

echo "Inhalt der zweiten Datei" > datei2.txt
cat datei1.txt datei2.txt
cat datei1.txt datei2.txt > zusammen.txt

# Beispiel 5:
grep "Zeile" < datei.txt
cat datei.txt |grep "Zeile"

weitere Beispiele

ls datei.txt datei4711.txt
ls datei.txt datei4711.txt 2> /dev/null

stdout UND stderr -> Datei umleiten
programm &> Datei.txt

stdout in Datei umleiten UND stderr in separate Datei umleiten
programm > Datei_stdout.txt 2> Datei_stderr.txt

stdout -> stderr
programm 1>&2

stderr -> stdout
programm 2>&1