Как заставить замолчать вывод в скрипте Bash?


149

У меня есть программа, которая выводит на стандартный вывод и хотела бы отключить этот вывод в скрипте Bash при передаче в файл.

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

% myprogram
% WELCOME TO MY PROGRAM
% Done.

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

#!/bin/bash
myprogram > sample.s

Насколько я помню, перенаправление вывода в файл приводит к тому, что он не отображается на терминале. Что не работает для вас?
Анон.


Ответы:


187

Если он также выводит на stderr, вы захотите замолчать. Вы можете сделать это, перенаправив дескриптор файла 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
Строка "&>" является более короткой версией того, что я только что опубликовал. Я не сталкивался с этим ярлыком раньше. Upvoting.
chradcliffe

5
&>намного старше, чем bash 4.
Игнасио Васкес-Абрамс

@ IgnacioVazquez-Abrams Можете ли вы связать &>введение документирования журнала изменений ? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 указывает, что >>&было введено в 4.0. Там нет упоминаний, &>но ИЗМЕНЕНИЯ возвращаются только к 2.0, так что я думаю, что это означает, что это было уже в 1.x.
tripleee

git blameна , redir.cуказует на 1998 коммиты старейшего появления еще в текущем коде.
tripleee

60

Перенаправить stderr на стандартный вывод

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

2>&1

Перенаправить стандартный вывод в файл

Теперь, когда вы выполняете это, вы перенаправляете стандартный вывод в файл. 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и порядок перенаправлений).
tripleee

2
не myprogram &>/dev/nullбудет достаточно?
JaviOverflow

38

Весь вывод:

scriptname &>/dev/null

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

scriptname >/dev/null 2>&1

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

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

Для более новой версии bash (без переноса):

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
@ Джон Нет, портативный способ для трубa 2>&1 | b 2>&1 | c
tripleee

9

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


2
Интересный хак ... голос за умение ^ _ ^
skplunkerin


0

Примечание. Этот ответ связан с вопросом «Как отключить эхо при выполнении сценария оболочки Linux», который в свою очередь был помечен как дублированный на этот.

Чтобы фактически отключить эхо, команда:

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.