각 명령에 대한 스크립트 출력의 각 줄 앞에 뭔가를 추가하고 싶습니다.
나는 다음과 같이 할 생각입니다 :
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 $$