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