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