Перенаправити як stderr, так і stdout на / dev / null за допомогою / bin / sh


61

Я пробував всі види способів перенаправляють як stdoutі stderrв /dev/nullбез будь - якого успіху. Я майже все життя керую басом, з яким у мене ніколи не виникало цього питання, але я один раз в 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

Ніщо насправді не працює. Я можу переспрямувати лише один з виходів, а не обидва одночасно.

Відповіді:


102

Це працюватиме в будь-якій сумісній з Posix оболонці:

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

Ви повинні спершу перенаправити stdout, перш ніж дублювати його в stderr ; якщо дублювати його спочатку, stderr просто вказуватиме на те, на що спочатку вказано stdout.

Bash , zsh та деякі інші оболонки також надають ярлик

ls good bad &>/dev/null

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


1
Дійсно, я читав посібник із обстріляних оболонок. У ньому зазначалося, що пізніші версії /bin/shреалізували &>/dev/nullсинтаксис, мабуть, не так, або я маю більш стару версію (яку я ніяк не можу повторити, запуск OpenBSD 5.3 tho, тому повинно бути достатньо)
Torxed

8
@Torxed, OpenBSD shзаснований на pdksh. Сьогодні більше немає оболонки Борна. cshпредставлена >&також доступна в zsh. bashвибрав &>(зараз також підтримується zshі деякими pdkshпохідними), хоча він чітко порушує відповідність POSIX, оскільки foo &> fileє абсолютно правильним синтаксисом POSIX, що означає щось зовсім інше.
Stéphane Chazelas

3
@ StéphaneChazelas (...), що означає щось зовсім інше. Ви залишили мене цікавити, що це означає в даному випадку ... :)
Пьотр Доброгост

4
@PiotrDobrogost, foo &> fileподібний foo & > fileабо foo & : > file, тобто запущений foo у фоновому режимі та відкритий файл для запису взагалі без команди (навряд чи він буде використаний так).
Стефан Шазелас

5
@PiotrDobrogost, >&не є ідеальним або як це суперечить >&2, >&-операторам. zshдодав його для зручності для користувачів csh (csh не має >&2). Вони просто синтаксичний цукор, просто використовувати > file 2>&1який є стандартним та портативним (до оболонок, подібних до Борна).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.