![하위 쉘에서 상위 쉘로 stdout/stderr 읽기](https://linux55.com/image/114976/%ED%95%98%EC%9C%84%20%EC%89%98%EC%97%90%EC%84%9C%20%EC%83%81%EC%9C%84%20%EC%89%98%EB%A1%9C%20stdout%2Fstderr%20%EC%9D%BD%EA%B8%B0.png)
쉘 스크립트에서 명명된 파이프를 사용하여 외부 프로세스 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로 보내고 PIPEOUT을 사용하여 프로세스 X의 표준 출력을 읽으려고 합니다.
위에서 내가 하려는 일은 stdin을 X로 보내기 전에 PIPEOUT에 대한 읽기를 설정하여 X의 모든 stdout/stderr이 캡처되었는지 확인하는 것입니다. 문제는 일부 백그라운드 프로세스(PIPEOUT에서 읽는 tail 또는 cat)를 실행하고 해당 stdio를 현재 터미널로 보내는 방법을 모른다는 것입니다.
내가 무슨 말을 하는지 아는 사람 있나요? 내가 올바르게 기억한다면, (1)이라고 표시된 줄을 수정하고 어떻게든 PIPEOUT에서 읽을 수 있는 읽기를 백그라운드에서 설정하고 해당 stdio를 현재 터미널/tty로 어떻게든 보내야 했습니다.
답변1
당신이 무엇을 하고 싶은지 명확하지 않습니다 tail -f $(tail -F PIPEOUT) &
. 이것은 tail -f
ing 파일 입니다.응 결과 tail -F
, 일반적으로 종료되지 않습니다. 내 가정은 시간이 얼마나 걸리더라도 파이프를 통과하는 모든 것을 출력하기를 원한다는 것입니다.
just의 문제 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
그러나 echo > foo
해당 줄을 작성한 후에는 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을 한 번만 여는 것입니다. 그렇지 않으면 프로그램이 작동 중지되는 것을 볼 수 있습니다.