#bash #awk #scripting #pipe
#bash #awk #сценарии #канал
Вопрос:
В cli
Я запускаю
ошибки нет
cmd=$(uname -a) | awk '{print $1}'
echo $?
0
с ошибкой
cmd=$(uname -a) | awk '{print $1}'
echo $?
0
Из-за использования |
i cannot preservate return код ошибки возврата из команды 1, я использую fd
как возможное решение, но безрезультатно
возможное решение
cmd=$(uname -a) 3>amp;2| awk '{print $1}' 2>amp;3
-bash: 3: Bad file descriptoruname: extra operand ‘ ’
РЕШАЕМАЯ
cmd=$(uname -a | awk '{print $1}' 2>amp;1)
echo $?
значение ненулевое.
Спасибо всем
Комментарии:
1. В чем ваш вопрос?
2. с
error
помощью …$?
должно возвращать ненулевое значение. Ошибка возникает при вводекоманды uname
3. См. unix.stackexchange.com/q/14270/187122 . Вы можете использовать массив
PIPESTATUS
для извлечения кодов выхода команд из конвейера.4. Хорошо, итак, вы исправили единственную обратную ссылку, но вы действительно хотите передать назначение
awk
? Назначения не имеют выходных данных, поэтому я предполагаю, что вы на самом деле хотели сделатьcmd=$(uname -a | awk '{print $1}')
.5. … и если бы это было целью, было бы уместно использовать приведенную выше формулировку с либо
set -o pipefail
илиPIPESTATUS
. Перенаправление файлового дескриптора, если оно само по себе не вызывает ошибок, не имеет никакого отношения к$?
, что делает вопрос бессмысленным на первый взгляд; статус выхода не передается через файловые дескрипторы в первую очередь.
Ответ №1:
Я подозреваю, что это все, что вам действительно нужно:
cmd=$(uname -a | awk '{print $1; f=1} END{exit !f}')
echo "$?"
Это завершится со статусом 0, если uname произведет какой-либо вывод, и awk успешно прочитает / распечатает его, 1 в противном случае.
Посмотрите:
$ cmd=$(uname -a | awk '{print $1; f=1} END{exit !f}')
$ echo "$?"
0
$ cmd=$(uname -a | awk '{print $1; f=1} END{exit !f}')
uname: extra operand ‘ ’
Try 'uname --help' for more information.
$ echo "$?"
1
Комментарии:
1. это не работает, если синтаксис uname неверен пример
uname -a
2. Да, это работает. Это не может НЕ работать, или с вашей оболочкой что-то не так. Я обновил свой ответ, чтобы показать, что он работает.
3. мой плохой, я поставил
end
вместоEND
4.
END
это ключевое слово, которое означает, что вы дошли до конца ввода, и поэтому соответствующее действие будет выполнено в это время.end
является переменной unset со значением 0-или-null, которая интерпретируется как ложное условие при использовании в условном контексте, и поэтому связанное действие никогда не будет выполнено.5. 1 итак, в случае ошибки в
uname
нем должно совпадатьEND
и завершаться,!f
но значениеf
сохраняется внутри{print $1; f=1}
. Я немного запутался в потоке.