파이프나 다른 것을 사용하여 명령 루프를 만드는 것이 가능합니까?

파이프나 다른 것을 사용하여 명령 루프를 만드는 것이 가능합니까?

지금까지 나는 마지막 명령에 도달할 때까지 한 명령의 stdout을 다음 명령의 stdin에 연결하여 일련의 명령을 연결하는 방법으로 파이핑 메커니즘을 알고 있습니다. 이 명령은 해당 stdout을 디스플레이나 파일과 연결합니다.

그러나 명령에서 루프를 만들어서 마지막 명령의 stdout이 첫 번째 명령의 stdin에 연결되고 어쩌면 tee를 사용하여 어떻게든 특정 출력의 변경 값을 표시할 수 있습니까?

답변1

거기에 있는 모든 쉘에 대해 잘 모르겠지만 Bash에서는 이름이 지정되지 않은 파이프는 아니지만 가능합니다. 따라서 기호는 아닙니다 |. 그러나 명명된 파이프를 생성하는 경우:

mkfifo fifo

그런 다음 사용할 수 있습니다.

<fifo cat | cat >fifo &

이제 파이프라인은 백그라운드에서 작동하지만 아무 작업도 수행하지 않습니다. 그러나 파이프라인 외부에서 파이프에 공급하는 경우:

echo x >fifo

파이프라인은 차단을 해제하고 영원히 계속될 것입니다. 또는 파이프를 배수할 때까지:

cat fifo

출력은 한 번 나타납니다.

x

이를 좀 더 정교하게 만들기 위해 파이프라인은 다음과 같을 수 있습니다.

<fifo cat | xargs -I@ echo @x >fifo &

x따라서 각 반복마다 출력에 을 추가합니다 . 물론 그럴 것입니다. 그러나 반복이 시작된 후에만 가능합니다. 즉, 파이프가 차단 해제되자마자 읽을 내용이 있는 즉시입니다. 이전과 마찬가지로 이 작업은 수동으로 시작할 수 있습니다.

echo x >fifo

이제 무엇이 표시되는지 살펴보세요 top. cat및 의 활동이 상당히 많아야 합니다 xargs.

x그리고 이전과 마찬가지로 파이프라인을 드레이닝하면 터미널에 많은 s가 표시되고 파이프라인이 차단됩니다.

유효한 질문이 될 것입니다. 왜 파이프라인이 배수됩니까? cat터미널에서 명령이 커밋되어 회로에 아무것도 남지 않는 이유는 무엇입니까 ? 나는 이것을 모른다.

답변2

루프를 만들고 변수를 사용하면 됩니다.

while true; do
    a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done

그러면 처음에 다시 사용될 마지막 출력이 저장됩니다.

답변3

기존 답변과 같이 명명된 파이프를 사용하지 않으면 Unix 셸에서 루프 파이프라인이 불가능합니다(다음을 사용하여 생성됨).mkfifo(1)). 하지만 C에서는 가능합니다. 예를 들어 여기 내더럽고 간단한 구현, 프로세스가 종료될 때까지 기다리지도 않았습니다.

이 정보가 도움이 되길 바랍니다.

관련 정보