Wrap-Befehl in der Eingabeaufforderung

7

Ist es möglich, nach dem Befehl ein Trennzeichen in eine Eingabeaufforderung einzufügen? Dies ist ein Beispiel:

~/Desktop: ls -al
-------------------------------------
total 80
drwx------+  6 eddie  staff   204B Apr 29 16:57 .
drwxr-xr-x+ 54 eddie  staff   1.8K Apr 30 10:54 ..

~/Desktop:

Insbesondere möchte ich den --------- Teil nach der Ausgabe eines Befehls hinzufügen, um den Befehl leichter vom Ergebnis zu unterscheiden

Eddie Monge Jr.
quelle
3
Für jeden Befehl? Was ist die Hölle?
Jordanm
Ideal für jeden Befehl, der tatsächlich eine Ausgabe hat. zsh
Eddie Monge Jr

Antworten:

9

In zsh können Sie die Hook-Funktion so definieren preexec, dass eine bestimmte Zeichenfolge wiederholt wird, bevor jeder Befehl ausgeführt wird.

In Bash können Sie die DEBUGFalle verwenden, um einen Preexec-Hook einzurichten, um dasselbe zu tun.

Sie würden eine preexec () - Funktion wie folgt definieren:

preexec () { echo "-------------------------------"; }
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    preexec
}
trap 'preexec_invoke_exec' DEBUG

Weitere Informationen finden Sie unter Hat bash einen Hook, der ausgeführt wird, bevor ein Befehl ausgeführt wird?

Ich denke nicht, dass dies in allen Versionen von Bash funktioniert. Auf meinem alten Ubuntu Server laufen bash 3.2.39 (1), help trapsagt

Wenn ein SIGNAL_SPEC DEBUG ist, wird ARG nach jedem einfachen Befehl ausgeführt.

Auf einem anderen Server, auf dem bash 4.1.2 (1) ausgeführt wird, heißt es

Wenn ein SIGNAL_SPEC DEBUG ist, wird ARG vor jedem einfachen Befehl ausgeführt.

Welches ist, was wir brauchen. Stellen Sie also sicher, dass in Ihrer Version von bash help trap" vor jedem einfachen Befehl" steht.

LarsH
quelle
5

Wenn Sie bash oder ksh für Ihre Shell verwenden, können Sie eine Funktion in einer Ihrer Punktedateien (.profile, .bash_profile usw.) wie folgt erstellen:

function hr {
    echo "--------------------------------------------------------------------------------"
}

Anschließend können Sie Befehlen voranstellen, wann immer Sie möchten, dass dieses Trennzeichen &&oder ;als Befehlstrennzeichen verwendet wird. Wie in:

bash-[534]$ hr && ls
--------------------------------------------------------------------------------
ddtool_23.jnlp  prtconf-pv

oder

bash-[536]$ hr ; ls -la
--------------------------------------------------------------------------------
total 36K
drwxr-xr-x  2 tim staff    4 2012-12-06 15:02 ./
drwxr-xr-x 46 tim staff  134 2013-04-30 14:59 ../
-rw-------  1 tim staff 2.7K 2012-12-06 15:00 ddtool_23.jnlp
-rw-r--r--  1 tim staff  24K 2012-12-06 15:02 prtconf-pv

Ich mache das Ich habe eine zweite Funktion, die auch einen dickeren Separator druckt.

function hr2 {
    echo "================================================================================"
}

Ich verwende diese Funktionen häufig in Shell-Skripten, um verschiedene Teile der Skripte zu trennen, z. B. hr2zwischen Hauptaufgaben und hrzwischen Elementen in einer Schleifenanweisung. Dies erleichtert das Lesen der Skriptausgabe erheblich.

Tim Kennedy
quelle
2
Warum nicht function hr { echo '---…'; "$@"; }stattdessen? Dann können Sie es ohne &&oder ;auch verwenden : hr ls -la. Ein noch dickerer Separator : figlet -- '---…'.
Manatwork
vor allem, weil ich nie daran gedacht habe. danke für die idee. :)
Tim Kennedy