В POSIX awk, как мне получить статус выхода (код возврата) от command
после обработки его вывода через command | getline var
? Я хочу, чтобы мой awk-скрипт был exit 1
, если command
вышел с ненулевым статусом выхода.Как получить статус выхода команды в конвейере getline?
Например, предположим, что у меня был сценарий AWK именем foo.awk
который выглядит следующим образом:
function close_and_get_exit_status(cmd) {
# magic goes here...
}
BEGIN {
cmd = "echo foo; echo bar; echo baz; false"
while ((cmd | getline line) > 0)
print "got a line of text: " line
if (close_and_get_exit_status(cmd) != 0) {
print "ERROR: command '" cmd "' failed" | "cat >&2"
exit 1
}
print "command '" cmd "' was successful"
}
я хочу следующее случиться:
$ awk -f foo.awk
got a line of text: foo
got a line of text: bar
got a line of text: baz
ERROR: command 'echo foo; echo bar; echo baz; false' failed
$ echo $?
1
Согласно POSIX specification for awk, command | getline
возвращает 1 для успешного ввода, ноль для конца файла и -1 для ошибки. Это не ошибка, если command
выходит с ненулевым статусом выхода, поэтому это невозможно использовать, чтобы проверить, выполнено ли command
и не удалось.
Аналогично, close()
не может использоваться для этой цели: close()
возвращает ненулевое значение, только если сбой завершен, а не если соответствующая команда возвращает ненулевой статус выхода. (В простаке, close(command)
возвращает статус выхода command
. Это поведение, я хотел бы, но я думаю, что это нарушает спецификацию POSIX и не все реализации AWK ведут себя таким образом.)
Функция AWK system()
возвращает статус выхода команды, но насколько я могу судить, нет способа использовать getline
.
+1 +1 вопрос. обратитесь к http://docs.freebsd.org/info/gawk/gawk.info.Getline.html, вы можете подумать использовать «ERRNO», чтобы помочь вам получить статус выхода. 'getline' возвращает 1, если находит запись, и 0, если встречается конец файла . Если в получении записи есть некоторая ошибка, такая как файл, который не может быть открыт, тогда 'getline' возвращает -1. В этом случае gawk устанавливает переменную 'ERRNO' в строку, описывающую ошибку , которая произошла. – BMW
@BMW: Спасибо за комментарий. К сожалению, у POSIX awk нет 'ERRNO'. Кроме того, даже в gawk команда, возвращающая ненулевое значение, не возвращает 'getline' значение -1. –
Сделайте это http://awk.freeshell.org/AllAboutGetline вместо awk.info –