Итак, у меня есть программа, которая может или не может выдать ошибку сегментации (./сегф), который также записывает другие данные в 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