Сохранение $? вывод с использованием нескольких операторов канала с использованием файловых дескрипторов

#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} . Я немного запутался в потоке.