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

149

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

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

% myprogram
% WELCOME TO MY PROGRAM
% Done.

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

#!/bin/bash
myprogram > sample.s
Сэм
источник
Насколько я помню, перенаправление вывода в файл приводит к тому, что он не отображается на терминале. Что не работает для вас?
Анон.
serverfault.com/questions/41964/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
Возможный дубликат Как подавить весь вывод команды с помощью Bash?
Ульрих Экхардт

Ответы:

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 что будет посылать все , чтобы СЭД

Matt
источник
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
4

Попробуйте с:

myprogram &>/dev/null

не получить выхода

Swathi
источник
0

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

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

stty -echo

(это, например, когда вы хотите ввести пароль и не хотите, чтобы он был читабельным. Не забудьте включить эхо в конце вашего скрипта, иначе человек, который запускает ваш скрипт, не увидит, что он / она набирает с этого момента. Чтобы включить эхо при запуске:

стое эхо

Berni
источник
0

Полезно в скриптах:


Получить только STDERR в файле, при этом скрывая любой STDOUT, даже если скрываемая программа вообще не существует (никогда не вешает родительский скрипт), это одно работало:

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

Полностью отсоедините и отключите все, даже уничтожение родительского сценария не прервет ./prog:

 ./prog </dev/null >/dev/null 2>&1 &
NVRM
источник
0

Для вывода только при ошибке :

так [команда]

логотип

Альберто Сальвия Новелла
источник