이 프로세스는 ECHOS에 필요하지 않은 "셸 프롬프트"를 대체합니다. 비활성화할 수 있나요?

이 프로세스는 ECHOS에 필요하지 않은 "셸 프롬프트"를 대체합니다. 비활성화할 수 있나요?

참고: 이 문제는 "프로세스 교체"의 비동기 처리로 인해 발생합니다. 스크립트 응답은 기만적이므로 많은 시간 손실이 발생합니다. 이전 관련 게시물은 여기에 있습니다.고양이가 교체 과정에서 멈춥니다. 무엇을 기다리고 있나요?

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( 증상이 잘못 사라지는 것을 방지하기 위해 추가했습니다 . 실행하는 데 추가 시간 pgrepwait걸리면 비동기 프로세스가 종료되기에 충분할 수도 있습니다.)

내부적으로 실행되는 프로세스가 기본 스크립트의 하위 프로세스라는 가정은 > >(...)내장 함수, 함수 및 그룹 명령과 함께 사용될 때만 적용됩니다.여기자세한 내용은.

관련 정보