Supondo que o script produza:
L1
L2
L4
L5
então o seguinte comando
script | sed 's/^\(.\+\)/ \[prepend\] /'
adiciona "[prepend]" a cada linha não vazia:
[prepend] L1
[prepend] L2
[prepend] L4
[prepend] L5
Eu quero acrescentar algo a cada linha de saída em um script, para cada comando.
Eu estava pensando em fazer algo assim:
rm foo
mkfifo foo
exec 3<>foo
cat <&3 | while read line; do
if [[ -n "$line" ]]; then
echo " [prepend] $line";
fi
done &
echo "foo" >&3
echo "bar" >&3
echo "baz" >&3
basicamente, para todos os comandos, quero acrescentar algo a cada linha da saída. Meu código acima é bastante falso, mas eu não sei como fazê-lo, é algo como o acima, mas não é bem assim.
Supondo que o script produza:
L1
L2
L4
L5
então o seguinte comando
script | sed 's/^\(.\+\)/ \[prepend\] /'
adiciona "[prepend]" a cada linha não vazia:
[prepend] L1
[prepend] L2
[prepend] L4
[prepend] L5
Você pode querer olhar para o DEBUG
trap no bash. De man builtins
:
If a sigspec is DEBUG, the command arg is executed before every simple command,
for command, case command, select command, every arithmetic for command, and
before the first command executes in a shell function (see SHELL GRAMMAR
above). Refer to the description of the extdebug option to the shopt builtin
for details of its effect on the DEBUG trap. If a sigspec is RETURN, the com‐
mand arg is executed each time a shell function or a script executed with the .
or source builtins finishes executing.
Então, você pode configurar uma função de depuração como essa. Como ele é executado antes dos comandos, você pode usá-lo para preceder a sua saída.
#!/bin/bash
debug() {
: # echo or other commands here
}
trap debug DEBUG
# Commands here
Esse código exato parece fazer o que eu quero, mas não tenho certeza de como é seguro:
rm foo
mkfifo foo
exec 3<>foo
(
cat <&3 | while read line; do
if [[ -n "$line" ]]; then
echo " [prepend] $line";
fi
done &
)
echo "" >&3;
echo "" >&3;
echo "foo" >&3
echo "bar" >&3
echo "baz" >&3
pkill -P $$
Tags bash stdout shell file-descriptors exec