awk system() 명령의 지정된 동작을 얻는 방법은 무엇입니까? [복사]

awk system() 명령의 지정된 동작을 얻는 방법은 무엇입니까? [복사]

저는 awk에서 다음과 같이 sleep 명령을 호출했습니다. system("sleep 15m")그리고 CTRL-C로 이를 중단하면 스크립트가 아닌 sleep 명령만 중단된다는 것을 발견했습니다. 그래서 제안된 대로 if 문에 시스템 기능을 래핑해 보았습니다.이 예제 스크립트에서는그리고 더 설명해주세요여기. 그러면 다음과 같습니다 if (system("sleep 15m") != 0) exit 1.

이것이 작동하지 않아서 시도해 보았지만 print system("sleep 3")항상 0을 반환했는데 이는 명시된 동작과 반대입니다. 실행되도록 두면 셸에 입력하면 sleep 30이 생성되고, 중단하면 130이 생성됩니다.echo $?

그렇다면 내가 무엇을 놓치고 있는 걸까요? 오타를 여러 번 확인하고 --posix 및 --traditional 스위치를 시도하고 사용자 가이드를 연구했지만 아무것도 변경되지 않았습니다.

$ awk --version
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)
Copyright (C) 1989, 1991-2015 Free Software Foundation.

답변1

어리석은 실수인 것 같습니다

$ echo foo | gawk '{print system("sleep 3")}'
^C0
$ 

와 관련이 있는 것 같습니다AWK가 호출되고 ^C != 0으로 중단되면 bash가 종료됩니다.

Keith가 제공하는 gawk 해결 방법

$ echo foo | awk '{if(system("sleep 3 && exit 42")==42){print "completed"}else{print "interrupted"}}'
completed
$ echo foo | awk '{if(system("sleep 3 && exit 42")==42){print "completed"}else{print "interrupted"}}'
^Cinterrupted
$

nawk가 올바르게 처리합니다.

$ echo foo | nawk '{print system("sleep 3")}'
^C0.0078125
$

관련 정보