Präfix für jede Ausgabe eines Befehls zur Laufzeit

16

Ich versuche ein modulares Skript zu erstellen. Ich habe mehrere Skripte / Befehle, die von einem einzigen Skript aufgerufen werden.
Ich möchte der Ausgabe jedes einzelnen Befehls ein Präfix voranstellen.

Beispiel:

Meine Dateien sind allcommands.sh / command1.sh / command2.sh

command1.sh Ausgängen
file exists
file moved

command2.sh Ausgängen
file copied
file emptied

allcommands.sh führt die Skripte command1.sh und command2.sh aus

Ich möchte jeder Ausgabe dieser beiden Skripte folgendes Präfix voranstellen:
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

Ivan Dokov
quelle
Versuchen Sie, jeden Befehl sed "s/\^/command1 /"
auszuführen, indem
Geben Sie mir bitte ein Beispiel mit den Informationen, die ich gebe. Ich verstehe die sedFunktionalität nicht wirklich . Es tut mir Leid.
Ivan Dokov

Antworten:

21

Ich gehe davon aus, dass Sie in allcommands.sh Folgendes tun:

command1.sh
command2.sh

Lass es einfach wieder los mit

command1.sh | sed "s/^/[command1] /"
command2.sh | sed "s/^/[command2] /"
j_kubik
quelle
9

Ein minimales Beispiel für allcommands.sh:

#!/bin/bash
for i in command{1,2}.sh; do
    ./"$i" | sed 's/^/['"${i%.sh}"'] /'
done

Mit command1.shund command2.shausführbar und in demselben Verzeichnis, in dem sich echodie gewünschten Zeichenfolgen befinden, erhalten Sie die Shell-Ausgabe:

$ ./command1.sh 
file exists
file moved
$ ./command2.sh 
file copied
file emptied
$ ./allcommands.sh 
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

Schnelle sedPanne

sed 's/^/['"${i%.sh}"'] /'
  • s/ Ruft den Modus "RegExp-Musterübereinstimmung und Ersetzen" auf
  • ^/ bedeutet "Finde den Anfang jeder Zeile"
  • ${i%.sh}geschieht im Shell-Kontext und bedeutet " $i, aber das Suffix entfernen .sh"
  • ['"${i%.sh}"'] /zuerst wird a gedruckt [, dann der angegebene Kontext verlassen, um die $iVariable aus der Shell zu holen , und dann erneut eingegeben, um mit dem ]und einem Leerzeichen abzuschließen.
Daniel Andersson
quelle
Danke für die Klarstellungen. Ihre Antwort war in der Tat hilfreich, aber das Beispiel von @ j_kubik war genau das, was ich brauche.
Ivan Dokov