참고: 이 문제는 "프로세스 교체"의 비동기 처리로 인해 발생합니다. 스크립트 응답은 기만적이므로 많은 시간 손실이 발생합니다. 이전 관련 게시물은 여기에 있습니다.고양이가 교체 과정에서 멈춥니다. 무엇을 기다리고 있나요?
Bash 4.4.19(1) - 출시됨
이 코드는 다음과 같은 이유로 사용됩니다.파이프를 사용할 수 없습니다..
func() {
in=$(cat)
echo "'this is it: $in'"
}
echo "a string" > >(func)
불행하게도 이 프로세스 교체는 내 문자열과 함께 프롬프트를 인쇄합니다.
user@srv:~$ ./test.sh
user@srv:~$ 'this is it: a string'
이것은 내 사용에 바람직하지 않습니다! 최소한으로 말하면! ! !
이상적인 것은 다음과 같은 정상적인 동작입니다.
user@srv:~$ ./test.sh
'this is it: a string'
프로세스 대체가 쉘 프롬프트를 인쇄하지 않도록 강제할 수 있습니까?
참고: 파이프를 사용할 수 없습니다...다른 문제가 발생합니다. 이로 인해 발생하는 문제는 다음과 같습니다. 명령 출력을 파일(한 줄)로 보내기 전에 처리할 수 있나요?
답변1
이는 스크립트가 프로세스로 대체된 하위 프로세스보다 먼저 반환되기 때문에 발생합니다 >(...)
.비동기적으로(즉, 백그라운드에서) 스크립트를 호출한 쉘이 프롬프트를 인쇄한 후에만 내용을 인쇄합니다.
해결 방법은 다음과 같습니다 wait
. 불행하게도 서브셸 등에서 실행되는 프로세스는 작업의 일부로 관리되지 않으며 bash
작업 테이블에 표시되지 않으므로 다음을 사용해야 합니다 pgrep -P
(부모별로 찾기).
func() {
in=$(cat)
sleep .2
echo "'this is it: $in'"
}
echo "a string" > >(func)
wait $(pgrep -P $$)
sleep .2
( 증상이 잘못 사라지는 것을 방지하기 위해 추가했습니다 . 실행하는 데 추가 시간 pgrep
이 wait
걸리면 비동기 프로세스가 종료되기에 충분할 수도 있습니다.)
내부적으로 실행되는 프로세스가 기본 스크립트의 하위 프로세스라는 가정은 > >(...)
내장 함수, 함수 및 그룹 명령과 함께 사용될 때만 적용됩니다.여기자세한 내용은.