Prefiks do każdego wyjścia polecenia w czasie wykonywania

16

Próbuję stworzyć modułowy skrypt. Mam kilka skryptów / poleceń, które są wywoływane z jednego skryptu.
Chcę prefiksować dane wyjściowe każdego oddzielnego polecenia.

Przykład:

Moje pliki to allcommands.sh / command1.sh / command2.sh

command1.sh wyjścia
file exists
file moved

command2.sh wyjścia
file copied
file emptied

allcommands.sh uruchamia skrypty command1.sh i command2.sh

Chcę poprzedzić każde wyjście tych dwóch skryptów w następujący sposób:
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

Ivan Dokov
źródło
Spróbuj uruchomić każde polecenie, przepuszczając jesed "s/\^/command1 /"
j_kubik
Podaj mi przykład z podanymi przeze mnie informacjami. Naprawdę nie rozumiem sedfunkcjonalności. Przykro mi.
Ivan Dokov

Odpowiedzi:

21

Zakładam, że to, co robisz w swoich allcommands.sh, to:

command1.sh
command2.sh

Po prostu przywróć to

command1.sh | sed "s/^/[command1] /"
command2.sh | sed "s/^/[command2] /"
j_kubik
źródło
9

Minimalny przykład allcommands.sh:

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

Za pomocą command1.shi command2.shwykonywalnego oraz w tym samym katalogu tylko echoszukając ciągów, daje to wynik powłoki:

$ ./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

Szybki sedpodział

sed 's/^/['"${i%.sh}"'] /'
  • s/ przechodzi w tryb „dopasuj wyrażenie regularne i zamień”
  • ^/ oznacza „dopasuj początek każdej linii”
  • ${i%.sh}dzieje się w kontekście powłoki i oznacza „ $i, ale usuń przyrostek .sh
  • ['"${i%.sh}"'] /na początku wypisuje a [, następnie wychodzi z cytowanego kontekstu, aby pobrać $izmienną z powłoki, a następnie ponownie wchodzi, aby zakończyć z ]i spacją.
Daniel Andersson
źródło
Dziękuję za wyjaśnienia. Twoja odpowiedź była pomocna, ale przykład @ j_kubik był właśnie tym, czego potrzebowałem.
Ivan Dokov