GNU/Linux >> Linux の 問題 >  >> Linux

Gnu Awk Errnoがコマンドの失敗に設定されていませんか?

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 resultcmd が実行されると、その出力は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

Linux
  1. サブスクリプション マネージャー:コマンドが見つかりません

  2. dnf:コマンドが見つかりません

  3. bc:コマンドが見つかりません

  1. dpkg:コマンドが見つかりません

  2. id:コマンドが見つかりません

  3. w:コマンドが見つかりません

  1. df:コマンドが見つかりません

  2. du:コマンドが見つかりません

  3. rm:コマンドが見つかりません