찾을 수 없는 명령은 반환 코드를 생성해야 합니다 127
.
$ foo; echo $?
bash: foo: command not found...
127
$?
변수에 할당한 다음 인쇄해 보았지만 rc
RC는 항상 0
.
$ foo | awk -v rc="$?" 'BEGIN{print rc}'
0
bash: foo: command not found...
이 경우에만 올바른 RC가 인쇄된다는 것을 확인했습니다.
$ qazqaz
bash: qazqaz: command not found...
$ foo | awk -v rc="$?" 'BEGIN{print rc}'
127
bash: foo: command not found...
파이프를 사용할 때 awk와 함께 RC를 사용할 수 있습니까? 아니면 문제가 다른 곳에 있습니까?
나는 오래된 휴대용 awk 구현을 고수하고 싶습니다.
답변1
파이프라인에서는 명령이 동시에 실행됩니다. 즉, 하나의 출력이 실시간으로 다른 출력으로 전달된다는 것입니다.
명령이 반환될 때만 명령의 종료 상태를 알 수 있습니다. awk
출력을 처리 하고 종료 상태에 액세스 하려면 foo
다음을 실행해야 합니다.awk
뒤쪽에 foo
출력 을 foo
다음과 유사한 위치에 저장한 후:
foo > file
awk -v "rc=$?" '{print rc, $0}' < file
또는 직접 awk
실행하고 foo
(명령줄을 해석하는 쉘을 사용하여) 출력을 읽고(인터페이스를 통해 파이프됨 cmd | getline
) popen()
다음을 통해 종료 상태를 얻을 수 있습니다.
awk -v cmd=foo '
BEGIN {
while ((cmd | getline) > 0) {
print
}
rc = close(cmd)
print rc
}'
awk
그러나 종료 상태가 인코딩되는 방식은 awk
구현마다 다릅니다. 어떤 경우에는 waitpid()
또는 에 의해 반환된 상태 이고, 다른 경우에는 1을 256으로 나눈 것입니다(신호에 의해 종료된 경우에도)... 하지만 pclose()
명령이 성공한 경우에만foo
0에 의존할 수 있어야 합니다.rc
의 경우 gawk
,최근에는 확실히 상황이 바뀌었어요.
또는 마지막에 종료 상태를 파이프할 수 있습니다.
(foo; echo "$?") | awk '
{saved = $0}
NR > 1 {
# process the previous line
$0 = prev
print "output:", $0
}
{prev = saved}
END{rc = prev; print rc}'
(가정 foo
출력은 비어 있지 않은 경우 개행으로 끝납니다(유효한 텍스트임)).
또는 별도의 파이프라인을 통해 공급됩니다. 예를 들어 Linux에서 ksh93 이외의 쉘을 사용하는 경우:
{ : extra pipe | { (foo 3<&-; echo "$?" > /dev/fd/3) | awk '
{print}
END {getline rc < "/dev/fd/3"; print rc}'
} 3<&0 <&4 4<&-; } 4<&0
답변2
type 명령 등을 사용하십시오.
type test > /dev/null 2>&1
echo $?
0
type fsfsf > /dev/null 2>&1
echo $?
1