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 3され、中断すると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
$

関連情報