Перенаправления и коды возврата

Перенаправления и коды возврата

Итак, у меня есть программа, которая может или не может выдать ошибку сегментации (./сегф), который также записывает другие данные в stderr. Когда программа выдает ошибку сегментации, ее код возврата равен 139 (т.е. echo $?выведет 139).

Я хотел бы перенаправить stderr на , /dev/nullчтобы избежать его печати, однако при этом ( ./segf 2>1) код возврата устанавливается в 1. Теперь невозможно отличить, действительно ли программа совершает ошибку сегментации или просто возвращает ошибку.

Можно ли передать другие ошибки stderr, сохранив при этом возможность проверить, что код возврата будет 139?

./segf >/dev/null; echo $?результаты в 139

./segf >/dev/null 2>1; echo $?результаты в 1

bash -c './segf'результаты в 139

bash -c './segf' 2>1результаты в 1

решение1

Ничто из того, что вы пробовали, не должно повлиять на статус выхода. Вы можете проверить с помощью этого очень простого скрипта:

#!/bin/sh
echo out
echo err >&2
exit 139

Теперь выполните его с различными перенаправлениями:

$ foo.sh; echo $?
out
err
139

#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139

## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $? 
out
139

Способ перенаправления stderr команды — просто command 2>/dev/null, но это никогда не должно влиять на статус выхода команды, если только перенаправление не даст сбой. Это, вероятно, и произошло в вашем случае. Если у вас нет прав на запись в каталоге, где вы находитесь, и вы попытались запустить ./segf >/dev/null 2>1(вместо ./segf >/dev/null 2>&1), это попыталось бы создатьфайлвызывается 1для перенаправления stderr в. Если файл не может быть создан, вы получите статус выхода 1:

$ foo.sh 2>1; echo $? 
bash: 1: Permission denied
1

Связанный контент