파이프 등을 사용하여 명령 루프를 구축할 수 있습니까?

파이프 등을 사용하여 명령 루프를 구축할 수 있습니까?

지금까지 나는 파이프 메커니즘이 마지막 명령에 도달할 때까지 한 명령의 표준 출력을 다음 명령의 표준 입력에 연결하고 표준 출력을 모니터나 파일에 연결하여 일련의 명령을 연결하는 방법이라는 것을 알고 있습니다.

그러나 마지막 명령의 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각 반복마다 출력에 1을 추가합니다. 물론 그렇습니다. 그러나 반복이 시작된 후, 파이프가 차단 해제되고 무언가를 읽을 수 있는 경우에만 가능합니다. 이전과 마찬가지로 수동으로 시작할 수 있습니다.

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

기존 답변으로 명명된 파이프를 사용하지 않는 경우(다음을 사용하여 생성)MKFIFO(1)). 하지만 C에서도 할 수 있습니다. 예를 들어 이것은 내 것입니다.더러운 간단한 구현, 프로세스가 종료될 때까지 기다리지 않고.

이 정보가 귀하에게 도움이 되기를 바랍니다.

관련 정보