Lê do descritor de arquivo e escreve para stdout

0

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.

    
por Alexander Mills 08.05.2018 / 06:01

3 respostas

1

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
    
por 09.05.2018 / 00:11
1

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
    
por 09.05.2018 / 01:20
0

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 $$
    
por 08.05.2018 / 06:25