На самом деле это раздражает, когда я не хочу видеть выход программы. Я хотел бы знать, есть ли более короткий способ написать:
$ program >/dev/null 2>&1
Общая оболочка - лучшая, но другие оболочки тоже будут интересны, особенно bash или тире.
На самом деле это раздражает, когда я не хочу видеть выход программы. Я хотел бы знать, есть ли более короткий способ написать:
$ program >/dev/null 2>&1
Общая оболочка - лучшая, но другие оболочки тоже будут интересны, особенно bash или тире.
>& /dev/null
Вы можете написать для этого функцию:
function nullify() {
"[email protected]" >/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
В bash, zsh и тире:
$ program >&- 2>&-
Он также работает в sh, потому что &-
является файловым дескриптором.
Обратите внимание, что это решение закрывает дескрипторы файла, а не перенаправляет их на /dev/null
, что может привести к остановке программ.
Большинство оболочек поддерживают псевдонимы. Например, в моем .zshrc у меня есть такие вещи, как:
alias -g no='2> /dev/null > /dev/null'
Затем я просто набираю
program no
Также стоит отметить, что часто перенаправление вывода не всегда необходимо. Многие программы 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
Изменить: решения на основе (:)
или |:
фактически эквивалентны закрытию дескриптора файла: true
не принимает входной файл.
Для всех оболочек:
$ program 2>&1|:
Для bash и bash -сложных оболочек (zsh...):
$ program &> >(:)
OR
$ program &> /dev/null
Это не работает для тире, потому что он отказывается управлять правом подстановки процесса подстановки файла.
Пояснения:
2>&1
перенаправляет stderr на stdout.|
является регулярным конвейером stdout для stdin другой команды.:
- это встроенная оболочка, которая ничего не делает (она эквивалентна true
).&>
перенаправляет выходы stdout и stderr в файл.>(your-command)
- это замена процесса. Он заменяется на путь к специальному файлу, например: /proc/self/fd/6
. Этот файл используется в качестве входного файла для команды your-command
.Если /dev/null
слишком много для ввода, вы можете (как root) сделать что-то вроде:
ln -s /dev/null /n
Тогда вы можете просто сделать:
program >/n 2>&1
Но, конечно, скрипты, которые вы пишете таким образом, не будут переноситься в другие системы, не устанавливая сначала эту символическую ссылку.
Решение Ayman Hourieh хорошо работает для одноразовых вызовов слишком частых программ. Но если есть только небольшой набор обычно называемых программ, для которых вы хотите отключить вывод, подумайте о том, чтобы отключить их, добавив следующее в ваш файл .bashrc
(или эквивалент, если вы используете другую оболочку):
CHATTY_PROGRAMS=(okular firefox libreoffice kwrite)
for PROGRAM in "${CHATTY_PROGRAMS[@]}"
do
printf -v eval_str '%q() { command %q "[email protected]" &>/dev/null; }' "$PROGRAM" "$PROGRAM"
eval "$eval_str"
done
Таким образом, вы можете продолжать вызывать программы, используя их обычные имена, но их вывод stdout и stderr исчезнет в ведро бит.
Обратите внимание также, что определенные программы позволяют вам настроить, сколько выходов для протоколирования/отладки они выводят. Для приложений KDE вы можете запускать kdebugdialog
и выборочно или глобально отключать вывод отладки.
Мне кажется, что самым портативным решением и лучшим ответом будет макрос на вашем терминале (ПК).
Таким образом, независимо от того, к какому серверу вы входите, он всегда будет там.
Если вы запускаете Windows, вы можете получить желаемый результат с помощью AHK (google it, it opensource) в двух крошечных строках кода. Это может перевести любую строку ключей в любую другую строку ключей на месте.
Вы вводите "ugly.sh → NULL", и он будет переписывать его как "ugly.sh 2 > & 1 > /dev/null" или что нет.
Решения для других платформ несколько сложнее. AppleScript может вставлять нажатия клавиш, но не может быть легко запущен.