Prefixo para cada saída de um comando em tempo de execução

16

Eu estou tentando fazer um script modular. Eu tenho vários scripts / comandos que são chamados de um único script.
Eu quero prefixar a saída de cada comando separado.

Examle:

Meus arquivos são allcommands.sh / command1.sh / command2.sh

Saídas command1.sh
file exists
file moved

Saídas command2.sh
file copied
file emptied

allcommands.sh executa os scripts command1.sh e command2.sh

Quero prefixar cada saída desses dois scripts como este:
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

Ivan Dokov
fonte
Tente executar cada comando tubulação-lo através desed "s/\^/command1 /"
j_kubik
Dê-me um exemplo com as informações que eu forneço. Eu realmente não entendo a sedfuncionalidade. Eu sinto Muito.
Ivan Dokov 23/07/2013

Respostas:

21

Suponho que o que você está fazendo no seu allcommands.sh é:

command1.sh
command2.sh

Apenas recoloque-o com

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

Um exemplo mínimo de allcommands.sh:

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

Com command1.she command2.shexecutável e no mesmo diretório apenas echoas strings desejadas, isso fornece a saída do shell:

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

sedAvaria rápida

sed 's/^/['"${i%.sh}"'] /'
  • s/ entra no modo "correspondência de padrão regexp e substitui"
  • ^/ significa "coincidir com o início de cada linha"
  • ${i%.sh}acontece no contexto do shell e significa " $i, mas retira o sufixo .sh"
  • ['"${i%.sh}"'] /primeiro imprime a [, sai do contexto citado para pegar a $ivariável do shell e depois entra novamente para terminar com o ]espaço e.
Daniel Andersson
fonte
Obrigado pelos esclarecimentos. Sua resposta foi realmente útil, mas o exemplo de @ j_kubik foi exatamente o que eu precisava.
Ivan Dokov 23/07