GNU/Linux >> Belajar Linux >  >> Linux

Gnu Awk Errno Tidak Disetel Pada Kegagalan Perintah?

Saya mencoba menjalankan beberapa perintah menggunakan getline() fungsi GNU awk dan cetak nomor kesalahan (errno ) nilai yang dikembalikan. Tetapi untuk kasus kegagalan sederhana dari direktori/file yang tidak ada, variabel tersebut tampaknya tidak terisi.

awk 'BEGIN {
        cmd = "ls -lrth /non/existing/path"
        while ( ( cmd | getline result ) > 0 ) {
            print result
        }
        close(cmd); print ENVIRON["ERRNO"]
}'

Ketika di atas mengeluarkan string kesalahan dari ls , print pernyataan tidak menghasilkan nomor kesalahan yang valid. Saya juga mencoba dari halaman manual untuk menggunakan PROCINFO["errno"] dan PROCINFO["ERRNO"] yang tidak berhasil. Saya juga mencoba mencetaknya sebelum menutup deskriptor file yang juga tidak berfungsi. Apakah salah mengharapkan ENOENT dalam hal ini?

Jawaban yang Diterima:

Anda tidak bisa mendapatkan nomor kesalahan menggunakan getline . Dalam perintah Anda, outputnya dari ls , bukan print result .

Dalam bentuk cmd | getline result , cmd dijalankan, maka outputnya disalurkan ke getline . Ini mengembalikan 1 jika mendapat output, jika EOF, -1 pada kegagalan. Masalahnya adalah kegagalan itu karena menjalankan getline itu sendiri, bukan kode kembalian cmd . Contoh:

awk 'BEGIN {
while ( ( getline result < "/etc/shadow") > 0 ) {
            print result
        }
        print "XXX: ", ERRNO
}'
XXX:  Permission denied

Anda akan melihat /etc/shadow tidak bisa dibaca, jadi getline gagal dijalankan dan melaporkan kesalahan dalam ERRNO variabel.

Perhatikan bahwa GNU awk akan mengembalikan cmd status jika tidak dalam mode posix, sehingga Anda dapat melakukan:

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

Dalam mode POSIX, Anda tidak akan mendapatkan status keluar:

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. manajer langganan:perintah tidak ditemukan

  2. dnf:perintah tidak ditemukan

  3. bc:perintah tidak ditemukan

  1. dpkg:perintah tidak ditemukan

  2. id:perintah tidak ditemukan

  3. w:perintah tidak ditemukan

  1. df:perintah tidak ditemukan

  2. du:perintah tidak ditemukan

  3. Bagaimana cara mendapatkan status keluar dari perintah Shell yang digunakan di GNU Makefile?