하위 쉘에서 상위 쉘로 stdout/stderr 읽기

하위 쉘에서 상위 쉘로 stdout/stderr 읽기

쉘 스크립트에서 명명된 파이프를 사용하여 외부 프로세스 X의 stdin에 쓰고 싶고 다른 명명된 파이프의 stdout/stderr을 현재 터미널로 보내고 싶습니다.

외부 프로세스 X는 PIPEIN을 통해 stdin을 수신하고 stdout/stderr을 PIPEOUT으로 보냅니다.

tail -f $(tail -F PIPEOUT) &  # (1) this is completely wrong, need help here

for i; do
    echo "${i}" > PIPEIN  # send stdin to X
done

echo "[stdin end]" > PIPEIN  # signal that we are done writing (there might be a better way lol)

따라서 위 스크립트에서는 이미 프로세스 X를 시작했으며 한동안 실행 중이었습니다. 그러나 이제 위 스크립트를 실행할 때 X에 일부 stdin을 보내고 PIPEOUT을 사용하여 프로세스 X에서 stdout을 읽고 싶습니다.

위에서 내가 하려는 일은 stdin을 X로 보내기 전에 PIPEOUT에 대한 읽기를 설정하여 X의 모든 stdout/stderr을 캡처했는지 확인하는 것입니다. 문제는 일부 백그라운드 프로세스를 실행하는 방법을 모른다는 것입니다. (PIPEOUT에서 읽으려면 tail 또는 cat) 해당 stdio를 현재 터미널로 보냅니다.

내가 무슨 말을 하는지 아는 사람 있나요? 내가 착각하지 않았다면 (1)이라고 표시된 줄을 수정하고 PIPEOUT에서 읽을 수 있는 읽기를 백그라운드에서 설정하고 해당 stdio를 어떻게든 현재 터미널/tty로 보낼 필요가 있습니다.

답변1

tail -f $(tail -F PIPEOUT) &당신이 무엇을 하려고 했는지 잘 모르겠습니다 . tail -f그 파일이 바로 그거야의 결과이다 tail -F, 일반적으로 종료되지 않습니다. 내 가정은 파이프를 통해 들어오는 모든 것을 출력하기를 원한다는 것입니다. 시간이 오래 걸리더라도 말이죠.

문제는 tail -f무엇이든 출력하기 전에 파일의 끝을 찾아야 한다는 것인데, 파이프에서는 이런 일이 절대 발생하지 않습니다. 당신은 할 수 있습니다tail대신에 명시적인 시작점을 제공하십시오 .-n +x, 시작할 라인을 선택합니다(처음부터 1-인덱스). tail -n 1 -f foo에서 얻을 수 있는 모든 것을 표시합니다 foo.

tr 'a-z' 'A-Z' < PIPEIN > PIPEOUT & # for example
tail -n +1 -f PIPEOUT &
for i in a b c d ; do
    echo $i > PIPEIN
done
echo "[stdin end]" > PIPEIN

그러나 줄을 작성한 후에는 foo가 닫힐 것이라는 점에 유의하십시오 echo > foo. 다른 쪽 끝의 명령은 이를 기꺼이 처리해야 합니다. 이 예가 인위적이고 실제 입력이 다른 곳에서 온 경우 이를 무시할 수 있습니다.


또한프로세스는 tail결코 종료되지 않습니다— 파이프를 통해 더 많은 것이 나올 것이라고 계속 기대합니다. 아마도 쉘의 작업 제어를 사용하여 명시적으로 직접 종료해야 합니다. 출력에 완료되었음을 나타내는 패턴이 있는 경우 다음을 찾을 수 있습니다.retail("정규 표현식을 사용한 꼬리")유용함 - retail -n +1 -f -u REGEX PIPEOUT일치하는 줄이 REGEX나타나면 종료됩니다. (면책 조항으로 저는 retail몇 년 전에 정확한 목적을 위해 글을 썼습니다)

답변2

한 번만 쓰기 위해 PIPEIN을 열면 프로그램이 종료됩니다. 2초 지연이 있더라도:

mkfifo PIPEIN PIPEOUT
tr 'a-z' 'A-Z' < PIPEIN > PIPEOUT & # for example
tail -n +1 -f PIPEOUT &
(
for i in a b c d ; do
    echo $i
done
sleep 2
echo "[stdin end]"
) > PIPEIN

fifo를 여러 번 열면 fifo를 읽는 사람이 fifo를 닫은 것으로 보일 수 있으므로 다른 독자가 와서 fifo를 읽을 때까지 작성자가 정지됩니다.

따라서 저장 베팅은 PIPEIN을 한 번만 여는 것입니다. 그렇지 않으면 프로그램이 잠기는 것을 볼 수 있습니다.

관련 정보