Как подавить весь вывод команды используя Bash?

213

У меня есть bash script, который запускает программу с параметрами. Эта программа выводит определенный статус (делая это, делая это...). Для этой программы нет возможности быть спокойным. Как я могу предотвратить отображение script чего-либо?

Я ищу что-то вроде windows echo off.

Теги:
scripting
echo

7 ответов

371
Лучший ответ

Следующее отправляет стандартный вывод на нулевое устройство (бит-ведро).

scriptname >/dev/null

и если вы также хотите, чтобы там были отправлены сообщения об ошибках, используйте один из них (первый может не работать во всех оболочках):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

и если вы хотите записать сообщения, но не видите их, замените /dev/null на фактический файл, например:

scriptname &>scriptname.out

Для полноты, под Windows cmd.exe(где "nul" является эквивалентом "/dev/null" ), это:

scriptname >nul 2>nul
  • 8
    Обратите внимание, что '&>' свойственно bash (и, возможно, оболочкам C); Для оболочек Корна и Борна требуется 2> / dev / null или 2> & 1 (чтобы отправить stderr в то же место, что и stdout). Оболочка Korn, по-видимому, интерпретирует '&>' как «запустите материал до и в фоновом режиме, а затем выполните перенаправление ввода / вывода по пустой команде».
  • 2
    Обратите внимание, что некоторые команды пишут непосредственно на терминальное устройство, а не на стандартный вывод / ошибку. Чтобы проверить, поместите echo foo > $(tty) в скрипт и запустите ./test.sh &> /dev/null - вывод все еще выводится на терминал. Конечно, это не проблема, если вы пишете скрипт, который не использует такие команды.
Показать ещё 3 комментария
27

Что-то вроде

script > /dev/null 2>&1

Это предотвратит вывод стандартных выходных и ошибок, перенаправляя их как на /dev/null.

  • 3
    Также достигается с помощью просто &>, если вы хотите сохранить набор текста;)
  • 1
    Несмотря на то, что я добавляю это в свою команду gs (GhostScript), она все равно печатает **** Предупреждение. Файл имеет поврежденный маркер %% EOF или мусор после %% EOF. Любой совет?
7

Try

: $(yourcommand)

: не подходит для "ничего не делать".

$() - это ваша команда.

  • 2
    Очень интересно, но есть ограничение: возвращаемый код состояния всегда равен 0 (успех). Давайте рассмотрим пример использования команды false которая всегда возвращает 1 (ошибка). Например ( echo foo | tee file ; false ) && echo bar отображает foo . Использование вашего трюка для подавления вывода: ( : $(echo foo | tee file ; false) ) && echo bar . Но он отображает bar означающую, что код состояния возврата равен 0 (это не возвращаемый код состояния из false ). Пожалуйста, обновите свой ответ с учетом этого ограничения. ура
  • 2
    @olibre, а как насчет DUMMY=$(yourcommand) ? Это не имеет ограничений, которые вы упомянули. :)
Показать ещё 1 комментарий
4

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

$ DUMMY=`grep root /etc/passwd`
$ echo $?
0
$ DUMMY=`grep r00t /etc/passwd`
$ echo $?
1

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

4

Как и пост andynormancx, используйте это: (если вы работаете в среде Unix)

scriptname > /dev/null

или вы можете использовать это: (если вы работаете в среде Windows)

scriptname > nul
  • 1
    Вы можете сделать это лучше, чем в оболочке Windows. Если вместо этого вы используете «scriptname> nul», то у вас даже не будет файла для удаления, так как «nul» является Windows-эквивалентом / dev / null.
  • 1
    @andynormancx: Это то, что я ненавижу в макете файловой системы Windows. Он «резервирует» имена файлов, такие как NUL, COM1, LPT1, CON и т. Д., Независимо от того, в каком каталоге вы находитесь (даже если вы находитесь в файловой системе, которая может иметь эти имена файлов, как в общих сетевых ресурсах).
Показать ещё 1 комментарий
1

С Bash Scripting, как я могу подавить весь вывод из команды?


IMHO, я считаю, что вы можете достичь простого использования этого перенаправления, как это было в первом ответе, и ничего больше:

/path/to/command &>/dev/null


Этот пример из Проект документации Linux стоит упомянуть также:

3.6 Образец: файл stderr и stdout 2

Это поместит каждый вывод программы в файл. Это подходит иногда для записей cron, если вы хотите, чтобы команда проходила абсолютную тишину.

     rm -f $(find / -name core) &> /dev/null 
0

В script вы можете добавить следующее к строкам, которые, как вы знаете, будут давать результат:

some_code 2>>/dev/null

Или вы также можете попробовать

some_code >>/dev/null

Ещё вопросы

Сообщество Overcoder
Наверх
Меню