파일 설명자에서 읽고 표준 출력에 쓰기

파일 설명자에서 읽고 표준 출력에 쓰기

각 명령에 대한 스크립트 출력의 각 줄 앞에 뭔가를 추가하고 싶습니다.

나는 다음과 같이 할 생각입니다 :

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

관련 정보