Префикс к каждому выводу команды во время выполнения

16

Я пытаюсь сделать модульный скрипт. У меня есть несколько скриптов / команд, которые вызываются из одного скрипта.
Я хочу префикс вывода каждой отдельной команды.

нелогич-:

Мои файлы: allcommands.sh / command1.sh / command2.sh

выходы command1.sh
file exists
file moved

выходы command2.sh
file copied
file emptied

allcommands.sh запускает сценарии command1.sh и command2.sh

Я хочу префикс каждого вывода этих двух сценариев, как это:
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

Иван Доков
источник
Попробуйте sed "s/\^/command1 /"
выполнить
Приведите, пожалуйста, пример с информацией, которую я предоставляю. Я не очень понимаю sedфункциональность. Мне жаль.
Иван Доков

Ответы:

21

Я предполагаю, что вы делаете в своем allcommands.sh:

command1.sh
command2.sh

Просто соотнесите это с

command1.sh | sed "s/^/[command1] /"
command2.sh | sed "s/^/[command2] /"
j_kubik
источник
9

Минимальный пример allcommands.sh:

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

С command1.shи command2.shисполняемым и в том же каталоге, echoсодержащем нужные строки, это дает вывод оболочки:

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

Быстрая sedполомка

sed 's/^/['"${i%.sh}"'] /'
  • s/ входит в режим регулярного выражения сопоставления и замены
  • ^/ означает «соответствовать началу каждой строки»
  • ${i%.sh}происходит в контексте оболочки и означает « $iно убери суффикс .sh»
  • ['"${i%.sh}"'] /сначала печатает a [, затем выходит из цитируемого контекста, чтобы получить $iпеременную из оболочки, затем снова входит, чтобы закончить с ]пробелом и.
Даниэль Андерссон
источник
Спасибо за разъяснения. Ваш ответ был действительно полезным, но пример @ j_kubik был именно тем, который мне нужен.
Иван Доков