나는 간단한 bash 스크립트를 작성하려고 시도했지만 제대로 작동하지 않습니다.
나는 원해요:
- 프로그램을 시작하고 텍스트 파일의 입력을 제공합니다(
./prog < input1.txt
). - 잠시 기다렸다가 키보드에 의해 방해받은 것처럼 종료합니다(
& PID=$!; sleep 1; kill -INT $PID
).원천 - 프로그램 출력과 텍스트 파일의 차이점 찾기 (
| diff -y output1.txt -
)원천
이것이 내가 지금 가지고 있는 것입니다. 이전 단계를 종합하면 다음과 같습니다.
./program < input1.txt & PID=$!; sleep 1; kill -INT $PID | diff -y output1.txt -
이 버전에서는 PID 줄이 숨겨져 있기 때문에 첫 번째 명령에 대한 출력이 항상 보고되지 않습니다. 프로그램 이름 뒤에 파일 리디렉션을 추가하면 이제 리디렉션을 가리키기 때문에 kill 명령이 작동을 멈춥니다.
bash --version
편집: Ubuntu 16.04 를 사용하고 있습니다.GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
답변1
실제로 코드 에서는 diff
.kill
program
()
스크립트의 또 다른 잠재적인 문제는 ;의 종료를 kill
기다리도록 설계되지 않았다는 것입니다. program
대신에 신호만 보냅니다. 따라서 diff
전체 출력이 캡처되지 않은 채 경쟁 조건이 작동하는 것을 볼 수 있습니다 program
. wait
내장된 bash 백그라운드 프로세스가 종료될 때까지 프로그래밍 방식으로 기다리는 것이 좋습니다 .
위의 수정 사항이 포함된 코드 예제는 다음과 같습니다.
#!/bin/bash
(
./program <input1.txt &
PID=$!
sleep 1
kill -INT $PID
wait
) | diff -y reference_output.txt -
답변2
프로세스 대체[1]를 사용할 수 있습니다.
diff -y output1.txt <(your_program & sleep 1; kill $!)
1초 안에 많은 양의 데이터를 생성할 수 있는 경우 your_program
(예: 기계를 yes(1)
사용하여 비슷한 스크립트를 사용해 보십시오 .diff
yes
slowyes
while echo y; do sleep .01; done
프로세스 <(...)
교체가 실행 중입니다.평행하게따라서 diff
데이터 처리를 시작하기 전에 완료될 때까지 기다리지 않습니다.
your_program
잠시 후가 아니라 여러 행을 생성한 후 중지하는 것이 더 나을 것 같습니다.
diff -y output1.txt <(your_program | head -n 1000)
이 경우 일반적으로 파이프의 왼쪽에서 하는 것처럼 your_program
제거해야 합니다 . SIGPIPE
프로그램이 무시 SIGPIPE
하고 write(2)
오류가 발생하는 경우 이에 대한 또 다른 질문이나 수정 방법 또는 해결 방법을 문의하십시오.
[1] 쉘이 프로세스 대체를 지원하지 않는 경우( /bin/sh
데비안과 같이 지원하지 않음 bash
) 다른 답변에 표시된 것처럼 파이프를 사용할 수도 있습니다.
{ your_program & sleep 1; kill $!; } | diff -y output1.txt -
이 경우에도 동일한 주의 사항이 적용됩니다.