web-dev-qa-db-ja.com

awkのsystem()呼び出しがこのように動作するのはなぜですか?

マニュアルによれば、実行されているコマンドの終了コードを返すsystem()を使用して、awk内でgrepを実行しようとしています。

$ cat foo.txt
bar
$ grep -q bar foo.txt; echo $?
0
$ awk 'BEGIN{ if ( system( "grep -q bar foo.txt" ) ) { print "yes" } else { print "no" } }'
no

-qを削除すると、grepが実際にbarを検出していることがわかります。そのため、grepは0を終了するため、「はい、いいえ」と出力しますか?

$ awk 'BEGIN{ if ( system( "grep bar foo.txt" ) ) { print "yes" } else { print "no" } }'
bar
no

方程式からgrepを完全に削除します。

$ awk 'BEGIN{ if ( system( "true" ) ) { print "yes" } else { print "no" } }'
no
5
jesse_b

シェルでは、終了コード0はコマンドの成功を表し、その他は失敗(およびその理由)を表します。これがsystemが返すものです。成功した場合は0ですが、awkはこれをFALSEと解釈します。ロジックを反転させる必要があります。

12
RudiC