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


297

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

Я ищу что-то похожее на Windows " echo off" .

Ответы:


511

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

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- вывод все еще выводится на терминал. Конечно, это не проблема, если вы пишете скрипт, который не использует такие команды.
10

1
@ l0b0, есть ли способ сделать tty скрипта (или любой другой программы) другим, чтобы весь вывод перенаправлялся независимо от вашего примера? Я знаю, что screen и script могут делать что-то подобное, но оба они привередливы и варьируются от * nix до * nix.
Brent

@yang /dev/nullсуществует в Cygwin, вам не нужно использовать nul.
dimo414

47

Что-то вроде

script > /dev/null 2>&1

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


5
Также достигается с помощью просто &>, если вы хотите сохранить некоторые данные;)
andynormancx

1
Несмотря на то, что я добавляю это в свою команду gs (GhostScript), она все равно печатает **** Предупреждение. Файл имеет поврежденный маркер %% EOF или мусор после %% EOF. Любой совет?
ZurabWeb

Это не запускает процесс на системах Unix, я должен был сделать2>/dev/null
Alper

14

Пытаться

: $(yourcommand)

: это сокращение от "ничего не делать".

$() это просто ваша команда.


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

2
@olibre, а что DUMMY=$(yourcommand)? Это не имеет ограничений, которые вы упомянули. :)
semente

3
@semente Perfect: команда DUMMY=$( echo foo | tee file ; false ) && echo barничего не отображает. И команда DUMMY=$( echo foo | tee file ; true ) && echo barотображает bar. Дайте мне знать, если вы дадите ответ, чтобы подтвердить это ;-) Cheers
olibre

9

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

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

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

Примечание: присвоение с ключевым словом typesetor declareрассматривается как команда, поэтому в качестве оценочного кода возврата в данном случае используется само присвоение, а не команда, выполняемая в вложенной оболочке:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

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

scriptname > /dev/null

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

scriptname > nul

1
Вы можете сделать это лучше, чем в оболочке Windows. Если вместо этого вы используете «scriptname> nul», то у вас даже не будет файла для удаления, так как «nul» - это Windows-эквивалент / dev / null.
andynormancx

1
@andynormancx: Это то, что я ненавижу в макете файловой системы Windows. Он «резервирует» имена файлов, такие как NUL, COM1, LPT1, CON и т. Д., Независимо от того, в каком каталоге вы находитесь (даже если вы находитесь в файловой системе, которая может иметь эти имена файлов, как в общих сетевых ресурсах).
сонный сон

Я не думаю, что я на самом деле использовал NUL начиная с DOS 5.x, когда я увидел этот ответ, внезапно вспыхнуло воспоминание;)
andynormancx

Если вы использовали > nulв Windows с Cygwin или Git Bash, и теперь вы застряли с nulфайлом, который не может быть удален, пожалуйста, попробуйте этот ответ , он работает как шарм.
Daemon Painter

4

Взгляните на этот пример из Проекта документации Linux :

3.6 Пример: файл stderr и stdout 2

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

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

Тем не менее, вы можете использовать это простое перенаправление:

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

1

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

some_code 2>>/dev/null

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

some_code >>/dev/null

1
никогда не видел >> to / dev / null .. из любопытства .. Зачем ты это делаешь?
Флориан Берндл

Это подавляет весь вывод?
Питер Мортенсен

Почему двойное ">" ( >>)?
Питер Мортенсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.