명령으로 실행될 때마다 쉘 스크립트가 실패하기를 원합니다.
일반적으로 나는 다음과 같이합니다.
set -e
set -o pipefail
(일반적으로 나는 set -u
또한 추가 )
문제는 위의 어느 것도 프로세스 대체와 함께 작동하지 않는다는 것입니다. 이 코드는 "ok"를 출력하고 리턴 코드 = 0으로 종료하지만 실패하고 싶습니다.
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
"pipefail"과 동일하지만 프로세스 대체를위한 것이 있습니까? 파일처럼 명령의 출력을 명령에 전달하는 다른 방법이지만 해당 프로그램이 실패 할 때마다 오류가 발생합니까?
가난한 사람의 솔루션은 해당 명령이 stderr에 기록되는지 감지하지만 (일부 명령은 성공적인 시나리오에서 stderr에 기록)
posix를 준수하는 또 다른 솔루션은 명명 된 파이프를 사용하는 것이지만 컴파일 된 코드에서 즉시 빌드 된 oneliners로 사용하는 프로세스 대체 명령을 시작해야하며 명명 된 파이프를 만들면 문제가 복잡해집니다 (추가 명령, 트래핑 오류) 삭제 등)
$$
프로세스 대체를 사용하는 명령이 "비쉘"코드 (파이썬)에서 생성 된 명령 파이프 라인 내에서 수행되므로 명령 대체가 수행되지 않으므로 대체가 작동하지 않습니다. 아마도 파이썬에서 하위 프로세스를 만들고 프로그래밍 방식으로 파이프해야합니다.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. 이 명령은pipe
셸이기 때문에 리더가 열릴 때까지 중단open()
됩니다pipe
. fs 링크에 대한 리더가있는 즉시 dpipe
가 링크 된rm
다음cat
해당 파이프의 셸 설명자에 파일 을 복사합니다. 어쨌든 프로세스 하위에서 오류를 전파하려면 do: <( ! : || kill -2 "$$")