getline()を使用していくつかのコマンドを実行しようとしました GNU awkの機能 エラー番号を出力します(errno )戻り値。ただし、ディレクトリ/ファイルが存在しないという単純な障害の場合、変数は入力されていないようです。
awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd); print ENVIRON["ERRNO"]
}'
上記がlsからエラー文字列を出力する場合 、print ステートメントは有効なエラー番号を生成しません。また、マニュアルページからPROCINFO["errno"]を使用してみました およびPROCINFO["ERRNO"] うまくいきませんでした。また、ファイル記述子を閉じる前に印刷してみましたが、これも機能しませんでした。 ENOENTを期待するのは間違っていますか この場合?
承認された回答:
getlineを使用してエラー番号を取得することはできません 。コマンドでは、出力はlsからのものです 、print resultではありません 。
フォームcmd | getline result 、cmd が実行されると、その出力はgetlineにパイプされます 。 1を返します 出力された場合、 EOFの場合、-1 失敗したとき。問題は、失敗はgetlineの実行によるものであるということです。 cmdの戻りコードではなくそれ自体 。例:
awk 'BEGIN {
while ( ( getline result < "/etc/shadow") > 0 ) {
print result
}
print "XXX: ", ERRNO
}'
XXX: Permission denied
/etc/shadowが表示されます 読み取れないので、getline 実行に失敗し、ERRNOでエラーを報告します 変数。
GNUawkはcmdを返すことに注意してください posixモードでない場合はステータスが表示されるため、次のことができます。
awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
status=close(cmd);
if (status != 0) {
code=and(rshift(status, 8),0xFF)
printf("Exit status: %d, exit code: %d\n", status, code)
}
}'
ls: cannot access '/non/existing/path': No such file or directory
Exit status: 512, exit code: 2
POSIXモードでは、終了ステータスは取得されません:
POSXILY_CORRECT=1 awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
status=close(cmd);
if (status != 0) {
code=and(rshift(status, 8),0xFF)
printf("Exit status: %d, exit code: %d\n", status, code)
}
}'
ls: cannot access '/non/existing/path': No such file or directory