중괄호로 묶인 명령 집합이 포함된 bash 스크립트가 있습니다 { ... }
. 이 그룹에는 몇 가지 초기 echo
명령이 포함되어 있으며한 바퀴. 각 반복에서 루프는 다양한 작업을 수행합니다.느린명령(기본적으로 curl
추가 구문 분석 포함) 각 반복은 네트워크 상호 작용으로 인해 느리지만 내가 아는 한 명령 자체는 작업을 종료하고 떠날 때 버퍼링 문제가 없어야 한다는 줄(Python 코드)을 인쇄합니다.
전체 명령 세트가 파이프로 연결되고 python -u
(확인하기 위해 이것도 시도했습니다 tail -f
) 분명히 전체 루프가 python -u
무엇이든 읽기 전에 실행되거나 읽혀집니다 tail -f
.
버퍼링을 해제하는 방법을 알고 있습니다(가능한 경우).하나명령어는 여러가지 도구와 비슷 stdbuf
하지만, 이쪽저쪽 명령어에서 문제가 발생하는 것이 아니라 명령어 그룹화에서 문제가 발생하는 것 같아서 여기서는 도움이 되지 않을 것 같습니다.
어떤 팁이 있나요?
답변1
(향후 독자를 위한 참고 사항: 여기서 화난 어조는 질문에 대한 것이 아니라 제가 답변하려고 시도하면서 저지른 실수와 그에 필요한 여러 가지 편집에 대한 것입니다.)
아, 안타깝네요. 문제는 tail -f
다음과 같습니다.
#!/bin/bash
printf 'hi\n'
{
for i in 1 2 3 4; do
sleep 0.5
/bin/echo $i
done;
} | cat
printf 'bye\n'
이것은 파이프라인이나 그룹이 아닙니다. 그것은 tail
. 그것은 우리 자신의 꼬리를 쫓는 것과 같습니다!
따라서 tail -f
어떤 이유로 즉시 출력되지 않기 때문에 실패합니다. 왜 실패했는지는 모르겠지만 python -u
스크립트에는 아무 것도 없다고 생각합니다. 한번 시도해 보세요 unbuffer
. cat
최소한 스크립트를 사용해 보고 이 경우 버퍼링이 발생하지 않는지 확인하십시오.
미래의 독자들이 댓글을 이해할 수 있도록 초기에 실패한 시도는 의도적으로 여기에 남겨 두었습니다.
이 스크립트는 귀하가 겪고 있는 것과 동일한 유형의 버퍼링 문제를 나타냅니다.
#!/bin/bash
printf 'hi\n'
{
for i in 1 2 3 4; do
sleep 0.5
printf '%s\n' $i
done;
} | tail -f
printf 'bye\n'
그렇지 않습니다. 그룹 내의 출력은 stderr로 리디렉션된 다음 전체 그룹의 stderr이 명령으로 파이프됩니다. 표준 오류이므로 버퍼링되지 않습니다.
#!/bin/bash
printf 'hi\n'
{
for i in 1 2 3 4; do
sleep 0.5
printf '%s\n' $i 1>&2
done;
} |& tail -f
printf 'bye\n'
Wang Hongqin의 답변에서 채택됨이 문제. 어려운 점은 명시적인 명령 대신 중괄호를 사용하여 파이프를 버퍼링 해제하는 방법을 찾는 것입니다. 리디렉션이 작동하도록 하려면 잠시 동안 조작해야 했습니다.
답변2
당신이 해야 할 일은 다음과 같습니다:
{ stdbuf -o0 curl ...
stdbuf -o0 whatever ...
}| tail -f
curl
...이것은 동적으로 연결된 응용 프로그램에서 작동하지만 자체적인 응용 프로그램이 포함되어 있다고 확신합니다.버퍼링 해제일종의 스위치.