Як я можу придушити весь вихід з команди за допомогою Bash?


296

У мене є сценарій Bash, який запускає програму з параметрами. Ця програма видає певний статус (роблячи це, роблячи це ...). Немає жодної можливості, щоб ця програма була тихою. Як я можу запобігти показу сценарію нічого?

Я шукаю щось на кшталт Windows "відлуння" .

Відповіді:


510

Далі подається стандартний вихід на нульовий пристрій (бітове відро).

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 (де "нуль" еквівалент "/ 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- вихід все ще надрукується на терміналі. Звичайно, це не проблема, якщо ви пишете сценарій, який не використовує таких команд.
l0b0

1
@ l0b0, чи можна зробити так, щоб сценарій (або будь-яка інша програма) був різним, щоб весь результат був перенаправлений незалежно від вашого прикладу? Я знаю, що екран і сценарій можуть робити щось подібне, але обидва вони вибагливі і відрізняються від * 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
Альпер

13

Спробуйте

: $(yourcommand)

: скорочено "нічого не робити".

$() це лише ваша команда.


3
Дуже цікаво, але є обмеження: повертається код статусу завжди 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)? Він не має обмеження, яке ви згадали. :)
semente

3
@semente Perfect: Команда DUMMY=$( echo foo | tee file ; false ) && echo barнічого не відображає. І DUMMY=$( echo foo | tee file ; true ) && echo barвідображається команда bar. Дайте мені знати , якщо ваш дати відповідь на upvote його ;-) Привітання
olibre

9

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

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

Оскільки Bash та інші інтерпретатори командного рядка POSIX не розглядають призначення змінних як команду, код повернення цієї команди дотримується.

Примітка: присвоєння ключовому слову typesetабо 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 тощо), незалежно від того, в якому каталозі ви перебуваєте (навіть якщо ви знаходитесь у файловій системі, яка може мати такі назви файлів, як, наприклад, у мережевих частках).
dreamlax

Я не думаю, що я насправді використовував NUL з DOS 5.x, мав раптовий спалах пам’яті, коли побачив цю відповідь;)
andynormancx

Якщо ви використовували > nulв Windows з cygwin або git bash і тепер у вас застряг nulфайл, який неможливо видалити, будь ласка, спробуйте цю відповідь , це спрацювало як шарм.
художник Демон

4

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

3.6 Зразок: файл stderr та stdout 2

Це дозволить розмістити кожен вихід програми у файл. Іноді це підходить для записів хронів, якщо ви хочете, щоб команда пройшла в абсолютній тиші.

     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.