User Tools

Site Tools


snippets:shell

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
snippets:shell [2025-06-25 20:09] – Seite mit den Abschnitten „OpenSSH“ und „journalctl“ erstellt malte70snippets:shell [2026-01-21 12:58] (current) – „fortune & cowsay“ um einen Screenshot erweitert malte70
Line 9: Line 9:
 ^ Betriebssystem ^ Shell ^ ^ Betriebssystem ^ Shell ^
 | macOS & GNU/Linux | ''bash'' & ''zsh'' | | macOS & GNU/Linux | ''bash'' & ''zsh'' |
 +
 +===== tmux: Shell-Sitzungen im Hintergrund =====
 +
 +Um eine Shell-Sitzung zu trennen und im Hintergrund weiter laufen zu lassen kann der Terminal-Multiplexer [[https://github.com/tmux/tmux/wiki|tmux]] verwendet werden.
 +
 +Im Gegensatz zu ''disown'' kann man sich später wieder mit der Sitzung verbinden und dort weiter arbeiten wo man aufgehört hat — egal ob am prompt oder in einer Anwendung.
 +
 +==== Sitzung starten ====
 +
 +<code bash>
 +# Eine neue tmux-Session starten
 +tmux
 +
 +# Eine neue Sitzung mit vorgegebenem Namen starten
 +tmux new -s my_session
 +</code>
 +
 +==== Sitzung trennen/tmux Steuerung ====
 +
 +<code bash>
 +# Von der aktuellen Sitzung trennen
 +tmux detach
 +</code>
 +
 +Tastenkombinationen für //tmux// sind zweiteilig; nach dem drücken von ''<Ctrl>+<B>'' folgt der eigentliche Befehl:
 +
 +<code>
 +# Von der aktuellen Sitzung trennen
 +<Ctrl>+<B>, <D>
 +
 +# Alle Tastenkombinationen anzeigen
 +<Ctrl>+<B>, <?>
 +</code>
 +
 +==== Laufende Sitzungen anzeigen ====
 +
 +<code bash>
 +tmux list-session
 +tmux ls
 +</code>
 +
 +<code>
 +0: 1 windows (created Mon Jan 19 18:57:53 2026)
 +yt-dlp: 1 windows (created Mon Jan 19 18:24:51 2026)
 +</code>
 +
 +==== Mit Sitzung verbinden ====
 +
 +Mit zuletzt aktiver Sitzung verbinden:
 +
 +<code bash>
 +tmux attach
 +</code>
 +
 +Mit einer bestimmten Sitzung verbinden:
 +
 +<code bash>
 +tmux attach -t yt-dlp
 +</code>
  
 ===== OpenSSH ===== ===== OpenSSH =====
Line 82: Line 141:
  --unit=NetworkManager.service  --unit=NetworkManager.service
 </code> </code>
 +
 +===== Textverarbeitung =====
 +
 +**TODO: Einführungstext**
 +
 +==== Einrückung ab der zweiten Zeile ====
 +
 +Mit dem folgenden ''sed''-Befehl lässt sich jede Zeile eines Textes leicht einrücken:
 +
 +<code bash>
 +sed "s/^/    /" input.txt
 +</code>
 +
 +Aber was ist, wenn die Einrückung erst ab der zweiten Zeile erscheinen soll?
 +
 +Im folgenden Beispiel soll eine mehrzeilige Meldung in eine Logdatei geschrieben werden: Vor der ersten Zeile soll der Zeitstempel stehen, jede weitere Zeile soll mit Leerzeichen um die Länge des Zeitstempel-Prefix eingerückt werden.
 +
 +Dafür wird der Text von einem kleinen ''awk''-Skript verarbeitet, das abhängig von der Zeilennummer (in der Variable ''NR'' gespeichert) entweder die Original-Zeilr wieder ausgibt, oder eben mit einem Prefix.
 +
 +<code bash>
 +# Die zu loggende Nachricht
 +msg="This is a message
 +with multiple lines."
 +
 +
 +# Zeitstempel und dessen Länge
 +timestamp=$(date --iso-8601=seconds)
 +timestamp_length=$(echo -n "$timestamp" | wc -c)
 +
 +# Der Prefix für alle Zeilen außer der ersten.
 +# Enthält $timestamp_length mal ein Leerzeichen, plus vier weitere für die Klammern und Leerzeichen vor und nach dem Zeitstempel
 +line_prefix=$(yes " " | head -$((timestamp_length + 4)) | tr -d "\n")
 +
 +
 +# Der Zeitstempel ohne abschließenden Zeilenumbruch
 +printf "[${timestamp}]  "
 +
 +# Ausgabe der Nachricht $msg inklusive Prefix
 +# Das awk-Skript prüft eine if-Klausel ob die Zeilennummer NR mindestens 2 ist, und gibt dann die ursprüngliche Zeile $0 mit einem Prefix aus, und falls nicht ohne den Prefix.
 +
 +# Lesbare Variante mit Zeilenumbrüchen und Einrückungen:
 +echo "${msg}" | awk "{
 + if (NR >= 2) {
 + print \"${line_prefix}\"$0;
 + } else {
 + print $0;
 + }
 +}"
 +
 +# Kompakte Variante in einer einzelnen Zeile:
 +echo "${msg}" | awk "{ if (NR >= 2) { print \"${line_prefix}\"$0; } else { print $0;} }"
 +</code>
 +
 +===== Just for fun: Ein cowsay-Dalek für fortune-Cookies =====
 +
 +> Hier sollte irgendwann eine kurze Einführung stehen …
 +
 +{{ :snippets:fortune_cowsay_dalek.png?350|}}
 +
 +Installation unter macOS:
 +
 +<code bash>
 +# macOS/Homebrew: fortune, cowsay und zusätzliche "Kühe" installieren
 +brew install fortune cowsay cowsay-org/cowsay/cowsay-files
 +
 +# Suchpfad für cowsay-Kühe
 +export COWPATH="/opt/homebrew/share/cowsay/cows:/opt/homebrew/share/cowsay-files/cows"
 +</code>
 +
 +Installation unter Fedora (cowsay-files muss hier von Hand installiert werden):
 +
 +<code bash>
 +# Fedora: fortune und cowsay via Paketverwaltung installieren
 +sudo dnf install fortune-mod cowsay
 +
 +# cowsay-files aus dem Git-Repository von Hand in
 +# ~/.local installieren
 +git clone https://github.com/paulkaefer/cowsay-files
 +cd cowsay-files
 +make prefix=$HOME/.local install
 +</code>
 +
 +Natürlich sollte ''$COWPATH'' in der Shell-Konfiguration hinterlegt werden (speichert den aktuell gesetzten Wert der Vatiable dauerhaft):
 +
 +<code bash>
 +# $COWPATH in .zshenv
 +echo -e "\n\n# \$COWPATH - Search path for cowsay(1)\nexport COWPATH=\"${COWPATH}\"\n" >> ~/.zshenv
 +
 +# $COWPATH in .bashrc speichern
 +echo -e "\n\n# \$COWPATH - Search path for cowsay(1)\nexport COWPATH=\"${COWPATH}\"\n" >> ~/.bashrc
 +</code>
 +
 +Nachdem alles eingerichtet ist kann es losgehen.
 +
 +Im folgenden Beispiel wird ein kurzer (''-s'') ''fortune(6)''-Glückskeks aus der Datenbank //literature// an ''cowsay(1)'' weiter gereicht und mit einer der zusätzlichen Kühe angezeigt (wobei der Text in der Sprechblase maximal 42 Zeichen breit sein darf):
 +
 +<code bash>
 +fortune -s literature \
 + | cowsay -f dalek -W 42
 +</code>
 +
 +==== bash: Zitat von einem QOTD-Server ====
 +
 +Statt eines ''fortune(6)''-Cookies kann zumindest in der Bash auch mein //Qoute of the day//-Server abgefragt werden. Wobei dieser genau genommen auf (größtenteils deutschsprachige) fortune-Datenbanken zurück greift.
 +
 +Oder du führst das [[https://hub.docker.com/r/malte70/bbs.qotd|Docker-Image (malte70/bbs.qotd)]] selbst aus.
 +
 +**Kleine Warnung**: Das ist mein erstes selbst gebautes Image überhaupt; es erlaubt bisher kaum Anpassungen wie sonst üblich über Umgebungsvariablen.
 +
 +<code bash>
 +cowsay -f dalek -W 42 </dev/tcp/giesskanne.flachbaum.de/17
 +</code>
 +
 +> //Info-Box//
 +
 +> Die Bash erlaubt eine Eingabe-/Ausgabeumleitung von bzw. zu einem Netzwerkdienst. Dabei wird auf eine nicht wirklich existierende  Datei nach dem Muster ''/dev/tcp/<hostname>/<port>'' zugegriffen.
 +
  
snippets/shell.1750882166.txt.gz · Last modified: by malte70