Есть ли в командной строке ярлык для "> / dev / null 2> & 1" - PullRequest
21 голосов
/ 30 мая 2009

Это действительно раздражает, если я не хочу видеть вывод программы. Я хотел бы знать, есть ли более короткий способ написать:

$ program >/dev/null 2>&1

Общая оболочка - лучшая, но было бы интересно узнать и другие оболочки, особенно bash или dash.

Ответы [ 9 ]

15 голосов
/ 30 мая 2009

Вы можете написать функцию для этого:

function nullify() {
  "$@" >/dev/null 2>&1
}

Чтобы использовать эту функцию:

nullify program arg1 arg2 ...

Конечно, вы можете называть функцию как хотите. Например, это может быть один символ.

Кстати, вы можете использовать exec для временного перенаправления stdout и stderr на /dev/null. Я не знаю, полезно ли это в вашем случае, но я подумала о том, чтобы поделиться этим.

# Save stdout, stderr to file descriptors 6, 7 respectively.
exec 6>&1 7>&2
# Redirect stdout, stderr to /dev/null
exec 1>/dev/null 2>/dev/null
# Run program.
program arg1 arg2 ...
# Restore stdout, stderr.
exec 1>&6 2>&7
14 голосов
/ 30 мая 2009
>& /dev/null
9 голосов
/ 27 июля 2013

In bash , zsh и dash :

$ program >&- 2>&-

Может также показаться для работы в других оболочках, потому что &- плохой файловый дескриптор.

Обратите внимание, что это решение закрывает дескрипторы файлов, а не перенаправляет их на /dev/null, что потенциально может привести к прерыванию работы программ.

6 голосов
/ 30 мая 2009

Большинство оболочек поддерживают псевдонимы. Например, в моем .zshrc у меня есть такие вещи:

alias -g no='2> /dev/null > /dev/null' 

Тогда я просто наберу

program no
2 голосов
/ 05 августа 2017

Редактировать: решения на основе (:) или |: могут вызвать ошибку, поскольку : не читает stdin. Хотя это может быть не так плохо, как закрытие файлового дескриптора, как предложено в ответе Заза.


  • Для оболочек и совместимых с ними оболочек (zsh ...):

    $ program &>/dev/null
    OR
    $ program &> >(:) # Should actually cause error or abortion
    
  • Для всех оболочек:

    $ program 2>&1 >/dev/null
    OR
    $ program 2>&1|: # Should actually cause error or abortion
    

    $ program 2>&1 > >(:) не работает для тире, потому что он отказывается работать с правом подстановки процесса подстановки файла.

Пояснения:

  • 2>&1 перенаправляет stderr (дескриптор файла 2) на стандартный вывод (дескриптор файла 1).
  • | - это обычная передача стандартного вывода на стандартный ввод другой команды.
  • : - встроенная оболочка, которая ничего не делает (она эквивалентна true).
  • &> перенаправляет вывод stdout и stderr в файл.
  • >(your-command) - процесс замещения. Он заменяется путем к специальному файлу, например: /proc/self/fd/6. Этот файл используется в качестве входного файла для команды your-command.

Примечание: процесс, пытающийся записать в закрытый дескриптор файла, получит ошибку EBADF (неверный дескриптор файла), которая с большей вероятностью приведет к прерыванию, чем попытка записи в | true. Последний вызовет ошибку EPIPE (pipe), см. Комментарий Чарльза Даффи.

2 голосов
/ 16 февраля 2017

Стоит также отметить, что зачастую перенаправление вывода не является действительно необходимым. Многие программы Unix и Linux принимают «флажок молчания», обычно -n или -q, который подавляет любой вывод и возвращает значение только в случае успеха или неудачи.

Например

grep foo bar.txt >/dev/null 2>&1
if [ $? -eq 0 ]; then
     do_something
fi

Может быть переписано как

grep -q foo bar.txt
if [ $? -eq 0 ]; then
     do_something
fi
2 голосов
/ 30 мая 2009

Если /dev/null слишком много для ввода, вы можете (как root) сделать что-то вроде:

ln -s /dev/null /n

Тогда вы можете просто сделать:

program >/n 2>&1

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

1 голос
/ 23 августа 2017

Решение Аймана Хури хорошо работает для одноразовых вызовов чрезмерно болтливых программ. Но если существует только небольшой набор обычно вызываемых программ, для которых вы хотите подавить вывод, подумайте о том, чтобы заставить их замолчать, добавив в файл .bashrc следующее (или эквивалент, если вы используете другую оболочку):

CHATTY_PROGRAMS=(okular firefox libreoffice kwrite)
for PROGRAM in "${CHATTY_PROGRAMS[@]}"
do
    printf -v eval_str '%q() { command %q "$@" &>/dev/null; }' "$PROGRAM" "$PROGRAM"
    eval "$eval_str"
done

Таким образом, вы можете продолжать вызывать программы, используя их обычные имена, но их вывод stdout и stderr исчезнет в области битов.

Обратите внимание, что некоторые программы позволяют вам настраивать объем выводимой в журнал записи / отладки. Для приложений KDE вы можете запустить kdebugdialog и выборочно или глобально отключить вывод отладочной информации.

0 голосов
/ 09 марта 2011

Мне кажется, что наиболее портативным решением и лучшим ответом будет макрос на вашем терминале (ПК).

Таким образом, независимо от того, к какому серверу вы подключаетесь, он всегда будет там.

Если вы запустили Windows, вы можете получить желаемый результат с помощью AHK (Google, это с открытым исходным кодом) в две крошечные строки кода. Это может преобразовать любую строку ключей в любую другую строку ключей, in situ.

Вы вводите "ugly.sh >> NULL", и он будет переписывать его как "ugly.sh 2> & 1> / dev / null" или что-то еще.

Решения для других платформ несколько сложнее. AppleScript может вставлять нажатия на клавиатуру, но не может быть вызван так легко.

...