Сократить или объединить несколько строк `&> / dev / null &`

11

Каждый раз, запуская машину, я запускаю следующую программу:

$ cat start.sh
#! /bin/bash
google-chrome &> /dev/null &
lantern &> /dev/null &
xdg-open . &> /dev/null &
emacs &> /dev/null  &
code ~/Programs/ &> /dev/null &
xdg-open ~/Reference/topic_regex.md &> /dev/null &

Громоздко &> /dev/null &... Как я мог сократить логику?

Исчисление
источник
2
Вы можете поместить все или большинство из этих программ в свои приложения запуска .
Приостановлено до дальнейшего уведомления.
отличное, фантастическое приложение. Ошибки обычно возникали в сеансе gnome, вызывая внезапные сбои, поэтому я запускаю их с сервера tmux. @DennisWilliamson
Исчисление

Ответы:

12

Часть &> /dev/nullозначает перенаправление вывода. Вы можете перенаправить несколько команд в один файл, сгруппировав их в блок:

#! /bin/bash
{
google-chrome &
lantern &
xdg-open . &
emacs  &
code ~/Programs/ &
xdg-open ~/Reference/topic_regex.md &
} &> /dev/null

Однако то же самое нельзя использовать для запуска отдельных команд в фоновом режиме ( &). Установка &после блока будет означать запуск всего блока в виде одного скрипта в фоновом режиме.

Melebius
источник
Обратите внимание, что &>синтаксис устарел и должен быть заменен на >/dev/null 2>&1 wiki-dev.bash-hackers.org/scripting/obsolete
multithr3at3d
4
@ multithr3at3d Bashism несовместим с POSIX? Конечно! Устаревший или устаревший? Нет , независимо от того, что думают три автора этого списка, который последний раз редактировался в 2015 году. Это короткая форма, и сокращение командных строк - вот цель ОП здесь. Если кто-то запускает #!/bin/bashсценарий в другой оболочке без предварительной проверки переносимости, это определенно не ошибка Bash, если он не работает.
десерт
12

Я написал функцию и поместил ее в мой, .bashrcчтобы запускать вещи, отделенные от моего терминала:

detach () 
{ 
    ( "$@" &> /dev/null & )
}

... а потом:

detach google-chrome
detach xdg-open ~/Reference/topic_regex.md

И потому что я ленивый, я также написал ярлык для xdg-open:

xo () 
{ 
    for var in "$@"; do
        detach xdg-open "$var";
    done
}

Поскольку xdg-openожидается ровно один аргумент, функция xoвыполняет итерацию по всем заданным аргументам и вызывает xdg-openкаждый из них в отдельности.

Это позволяет:

detach google-chrome
xo . ~/Reference/topic_regex.md
PerlDuck
источник
5

Вы можете перенаправить вывод для всех последующих команд с помощью

exec 1>/dev/null
exec 2>/dev/null
о нет
источник
3

Вы можете создать цикл и дать ему команды в качестве аргументов:

for i in google-chrome "xdg-open ." "code ~/Programs/"; do
  $i &
done &>/dev/null

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

Десерт
источник
3

Я создал специальный файл, например, /dev/nullс более коротким путем, чтобы сократить перенаправление. Я использовал в /nкачестве пути к новому файлу:

sudo mknod -m 0666 /n c 1 3

Таким образом, вы можете сократить отдельные строки, например:

google-chrome &>/n &

Источник: Как создать / dev / null?

Десерт
источник