Як замовкнути вихід у сценарії Bash?


149

У мене є програма, яка виводить stdout і хотіла б замовкнути цей вихід у сценарії Bash під час передачі файлів у файл.

Наприклад, запуск програми виведе:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Я хочу, щоб наступний сценарій нічого не виводив на термінал:

#!/bin/bash
myprogram > sample.s

З того, що я пам'ятаю, перенаправлення виводу до файлу призводить до того, що він не відлунюється до терміналу. Що для вас не працює?
Анон.


Відповіді:


187

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

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
Рядок "&>" - це скорочена версія того, що я щойно опублікував. Я раніше не стикався з цим ярликом. Оголошення.
chradcliffe

5
&>набагато старший за баш 4.
Ігнасіо Васкес-Абрамс

@ IgnacioVazquez-Abrams Чи можете ви зв’язати &>вступ із документацією змін ? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 вказує, що >>&було введено в 4.0. Ніякої згадки немає, &>але ЗМІНИ повертаються лише до 2.0, тому я думаю, це означає, що це було вже в 1.x.
трійка

git blameстосовно redir.cпункту 1998 року для найдавнішого події, що все ще знаходиться в поточній кодовій базі.
трійка

60

Перенаправити stderr на stdout

Це перенаправить stderr (який є дескриптором 2) на дескриптор файлу 1, який є stdout.

2>&1

Перенаправити stdout на файл

Тепер, виконуючи це, ви перенаправляєте stdout у файл sample.s

myprogram > sample.s

Перенаправити stderr та stdout у файл

Поєднання двох команд призведе до перенаправлення як stderr, так і stdout до sample.s

myprogram > sample.s 2>&1

Перенаправити stderr та stdout на / dev / null

Перенаправляйте, /dev/nullякщо ви хочете повністю замовкнути свою заявку.

myprogram >/dev/null 2>&1

13
В останньому відсутній оператор перенаправлення; це має бути myprogram >/dev/null 2>&1(зауважте клин раніше /dev/nullі порядок переадресацій).
трійка

2
не myprogram &>/dev/nullвистачило б?
JaviOverflow

38

Весь вихід:

scriptname &>/dev/null

Портативний:

scriptname >/dev/null 2>&1

Портативний:

scriptname >/dev/null 2>/dev/null

Для більш нового башу (без портативного):

scriptname &>-

Це не працює. Він фактично створює файл з назвою -і &>є переносним розширенням оболонки Bourne.
PhilT

Портативний еквівалент echo moo 1>&-видає помилку, оскільки дескриптор файлу 1 закритий:-bash: echo: write error: Bad file descriptor
tripleee

11

Якщо ви хочете, щоб STDOUT і STDERR обидва [все], тоді найпростіший спосіб:

#!/bin/bash
myprogram >& sample.s

тоді запустіть його так ./script, і ви не отримаєте жодного виводу на свій термінал. :)

"> &" означає STDERR і STDOUT. &також працює так само , як з трубкою: ./script |& sed що буде посилати все , щоб СЕД


7
man bash (у розділі "Перенаправлення стандартного виводу та стандартна помилка") говорить &> та> & еквівалентно, але перше (&>) є кращим. Однак | & це єдиний спосіб зробити це для труб.
Джон Меллор

1
@John Ні, портативний спосіб для трубa 2>&1 | b 2>&1 | c
tripleee

9

Якщо ви все ще намагаєтеся знайти відповідь, особливо якщо ви створили файл для виводу, і ви віддаєте перевагу чітку альтернативу: echo "hi" | grep "use this hack to hide the oputut :) "


2
Цікавий хак ... прихильність до кмітливості ^ _ ^
skplunkerin


0

Примітка. Ця відповідь пов'язана з питанням "Як відключити відлуння під час виконання сценарію оболонки Linux", який, в свою чергу, був позначений як дубльований на цей.

Насправді вимкнути луну команда:

stty -ехо

(це, наприклад, коли ви хочете ввести пароль і не хочете, щоб він був читабельним. Не забудьте ввімкнути ехо в кінці сценарію, інакше людина, яка запускає ваш сценарій, не побачить, що він / вона вводить з цього моменту. Щоб увімкнути луна:

stty echo


0

Корисно в сценаріях:


Отримайте лише файл STDERR у файлі, приховавши будь-який STDOUT, навіть якщо програма для приховування взагалі не існує (ніколи не висить батьківський скрипт), це одне працювало:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Відкрийте повністю і замовкніть все, навіть вбивство батьківського сценарію не перерве ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.