Ich möchte meine .bashrc-Datei so bearbeiten, dass jeder auf der Shell ausgeführte Befehl an eine bestimmte Adresse weitergeleitet wird. Beispiel:
$ sudo apt update
_________________
< sudo apt update >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Ich habe etwas ziemlich Ähnliches geschafft, aber nicht ganz:
$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
_______
< Hello AU! >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Dies ist nicht das gewünschte Ergebnis, da dies erst nach dem Verlassen der aktuellen Shell erfolgt.
Es ist hauptsächlich für Spaß / Lernzwecke.
command-line
bash
bashrc
M. Becerra
quelle
quelle
-n
Flagge zu verwendencowsay
. Dadurch bleibt das Leerzeichen erhalten.Antworten:
Sie können Ihre Methode ein wenig anpassen. Anstatt
cowsay
direkt an weiterzuleiten, lesen Sie die Ausgabe bis zu einem Begrenzungszeichen, senden Sie diese Ausgabe ancowsay
und drucken Sie dieses Zeichen nach jedem Befehl aus:Hier verwende ich das ASCII-NUL-Zeichen. Sie können etwas anderes verwenden, das in der Befehlsausgabe wahrscheinlich nicht enthalten ist.
Dies wird nach der Eingabeaufforderung gedruckt, so dass die Ausgabe hässlich ist:
Beachten Sie, dass dies jeden Befehl unterbricht, der eine komplexe Ausgabe versucht oder eine Textbenutzeroberfläche hat (denken Sie an Befehlszeileneditoren, Pager usw.).
Vorausgesetzt, Sie wissen bereits, was
exec > >(...)
passiert, ist der Teil der Prozessersetzung:while IFS= read -d '' -r line; do ... done
: Dies ist eine ziemlich verbreitete Redewendung zum Lesen von Daten, die durch das ASCII-NUL-Zeichen begrenzt sind:IFS=
Setzt das IFS auf die leere Zeichenfolge, wodurch die Feldaufteilung deaktiviert wird-r
verhindertread
, dass\
die Eingabe speziell behandelt wird (wird also\n
beispielsweise gelesen\n
und nicht in das Zeilenumbruchzeichen konvertiert).-d ''
ist der Weg zu sagenread
, bis das NUL-Zeichen zu lesenDas Ganze durchläuft also die Eingabe in durch NUL getrennten Abschnitten, wobei der Inhalt der Eingabe so weit wie möglich erhalten bleibt.
if [[ -n $line ]]; then ... fi; done
- nur dann handeln, wenn der bisher gelesene Eingang nicht leer ist.echo; printf "%s\n" "$line" | cowsay;
- Eine führende leere Zeile ausgeben, damit die Ausgabe von cowsay nicht mit der Eingabeaufforderung kollidiert, und dann die bis dahin gelesene Eingabe an cowsay senden.printf
ist zuverlässiger und sicherer alsecho
.quelle
Sie können
trap
dasDEBUG
Signal der Bash missbrauchen :Beispiellauf
Dadurch wird der Befehl jedoch weiterhin ausgeführt. Dank ilkkachu habe ich einen Weg gefunden, das zu umgehen :
quelle