各コマンドのスクリプト出力の各行の前に何かを追加したいと思います。
私は次のようにするつもりです。
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
DEBUG
bashの問題を見たいと思うかもしれません。から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 $$