Prefijo a cada salida de un comando en tiempo de ejecución

16

Estoy tratando de hacer un script modular. Tengo varios scripts / comandos que se invocan desde un solo script.
Quiero prefijar la salida de cada comando por separado.

Examinar:

Mis archivos son allcommands.sh / command1.sh / command2.sh

salidas command1.sh
file exists
file moved

salidas command2.sh
file copied
file emptied

allcommands.sh ejecuta los scripts command1.sh y command2.sh

Quiero prefijar cada salida de estos dos scripts como este:
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

Ivan Dokov
fuente
Trate de ejecutar cada comando sed "s/\^/command1 /"
canalizándolo
Dame un ejemplo con la información que doy. Realmente no entiendo la sedfuncionalidad. Lo siento.
Ivan Dokov

Respuestas:

21

Supongo que lo que está haciendo en allcommands.sh es:

command1.sh
command2.sh

Solo relaciona con

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

Un ejemplo mínimo de allcommands.sh:

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

Con command1.shy command2.shejecutable y en el mismo directorio que solo echocontiene las cadenas deseadas, esto da la salida del 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

sedDesglose rápido

sed 's/^/['"${i%.sh}"'] /'
  • s/ ingresa al modo "coincidencia y reemplazo de patrones regexp"
  • ^/ significa "coincidir con el comienzo de cada línea"
  • ${i%.sh}sucede en el contexto de shell y significa " $i, pero elimina el sufijo .sh"
  • ['"${i%.sh}"'] /al principio imprime a [, luego sale del contexto citado para tomar la $ivariable del shell, luego vuelve a ingresar para terminar con ]y un espacio.
Daniel Andersson
fuente
Gracias por las aclaraciones. Su respuesta fue realmente útil, pero el ejemplo de @ j_kubik fue el que necesitaba.
Ivan Dokov