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

16

Estou tentando criar 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.

Examinar:

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

outputs de command1.sh
file exists e file moved

command2.sh saídas de file copied e file emptied

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

Eu quero prefixar cada saída desses dois scripts da seguinte maneira:
[command1] file exists
[command1] file moved e [command2] file copied e [command2] file emptied

    
por Ivan Dokov 23.07.2013 / 12:58

2 respostas

19

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

command1.sh
command2.sh

Apenas relacione-o com

command1.sh | sed "s/^/[command1] /"
command2.sh | sed "s/^/[command2] /"
    
por 23.07.2013 / 13:29
7

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.sh e command2.sh executável e no mesmo diretório apenas echo ing das strings desejadas, isso fornece a saída da 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

Rápido sed breakdown

sed 's/^/['"${i%.sh}"'] /'
  • s/ entra no modo "correspondência de padrões regexp e substitui"
  • ^/ significa "corresponde ao início de cada linha"
  • ${i%.sh} acontece no contexto da shell e significa " $i , mas tira o sufixo .sh "
  • ['"${i%.sh}"'] / primeiro imprime um [ , depois sai do contexto citado para pegar a variável $i do shell e, em seguida, entra novamente para terminar com o ] e um espaço.
por 23.07.2013 / 13:28