ファイル記述子から読み込み、標準出力に書き込む

ファイル記述子から読み込み、標準出力に書き込む

各コマンドのスクリプト出力の各行の前に何かを追加したいと思います。

私は次のようにするつもりです。

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

基本的に、すべてのコマンドに対して各出力行の前に何かを追加したいと思います。上記のコードはかなり偽ですが、何をすべきかわかりません。上記と似ていますが、まったく同じではありません。

答え1

スクリプトが以下を生成すると仮定します。

L1
L2

L4
L5

次に、次のコマンドを実行します。

script | sed 's/^\(.\+\)/ \[prepend\] \1/'

空でない各行の前に「[prepend]」を追加します。

 [prepend] L1
 [prepend] L2

 [prepend] L4
 [prepend] L5

答え2

DEBUGbashの問題を見たいと思うかもしれません。から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.

したがって、このようなデバッグ機能を設定できます。コマンドの前に実行されるので、それを使用して出力の前に追加できます。

#!/bin/bash

debug() {
   : # echo or other commands here
}

trap debug DEBUG

# Commands here

答え3

この正確なコードは私が望むように動作するようですが、どれほど安全であるかはわかりません。

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

関連情報