Перенаправьте как stderr, так и stdout в / dev / null с помощью / bin / sh

61

Я пробовал все виды способов перенаправляют как stdoutи stderrв /dev/nullбез какого - либо успеха. У меня почти всю жизнь работает bash, с которым у меня никогда не было этой проблемы, но на этот раз в BSD я застрял /bin/sh.

Что я пробовал:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... который работает; если Python отсутствует, он отключит сообщения об ошибках от ls. Однако, если python.tgzприсутствует, выводится строка с, которая выглядит так:

# ./test.sh
./python-2.7.3p1.tgz

Я пробовал:

if ls ./python* &> /dev/null; then
    echo found Python
fi

а также

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

а также

if ls ./python* > /dev/null; then
    echo found Python
fi

Ничего действительно не работает. Я могу перенаправить только один из выходов, а не оба одновременно.

Torxed
источник

Ответы:

102

Это будет работать в любой Posix-совместимой оболочке:

ls good bad >/dev/null 2>&1

Вы должны перенаправить стандартный вывод прежде, чем дублировать его в стандартный вывод ; если вы сначала скопируете его, stderr просто укажет на то, на что изначально указал stdout.

Bash , Zsh и некоторые другие оболочки также предоставляют ярлык

ls good bad &>/dev/null

что удобно в командной строке, но его следует избегать в сценариях, предназначенных для переносимости.

RICi
источник
1
Действительно, я прочитал руководство по использованию Bourn Shell. В нем говорилось, что в более поздних версиях /bin/shреализован &>/dev/nullсинтаксис, по-видимому, нет, или у меня более старая версия (которую я никак не могу
отразить,
8
@ Torxed, OpenBSD shоснован на pdksh. Там нет больше оболочки Борна в настоящее время. cshвведены >&также доступны в zsh. bashвыбрано &>(теперь также поддерживается zshи некоторыми pdkshпроизводными), хотя оно явно нарушает соответствие POSIX, так как foo &> fileэто совершенно правильный синтаксис POSIX, который означает нечто совершенно иное.
Стефан Шазелас
3
@ StéphaneChazelas (...) что означает что-то совершенно другое. Вы оставили меня удивленным, что это значит в этом случае ... :)
Петр Доброгост
4
@PiotrDobrogost, foo &> fileэто как foo & > fileили foo & : > file, то есть запускает foo в фоновом режиме и открывает файл для записи без какой-либо команды (вряд ли будет использоваться таким образом).
Стефан Шазелас
5
@PiotrDobrogost, >&не является идеальным или как это противоречит >&2, >&-операторам. zshдобавил это для удобства пользователей csh (csh не имеет >&2). Они просто синтаксический сахар, просто использование, > file 2>&1которое является стандартным и переносимым (для оболочек типа Борна).
Стефан Шазелас