Skróć lub połącz wiele linii `&> / dev / null &`

11

Przy każdym uruchomieniu komputera uruchamiam następujący program:

$ 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 &

Uciążliwe &> /dev/null &... Jak mogę skrócić logikę?

Rachunek różniczkowy
źródło
2
Możesz umieścić wszystkie lub większość tych programów w swoich aplikacjach startowych .
Wstrzymano do odwołania.
świetna, fantastyczna aplikacja. Błędy zwykle występowały podczas sesji gnome, powodując nagłe awarie, więc uruchamiam je z serwera Tmux. @DennisWilliamson
Calculus

Odpowiedzi:

12

Część &> /dev/nulloznacza przekierowanie wyjścia. Możesz przekierować wiele poleceń do tego samego pliku, grupując je w blok:

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

Tego samego nie można jednak użyć do uruchomienia poszczególnych poleceń w tle ( &). Umieszczenie &po bloku oznaczałoby uruchomienie całego bloku jako pojedynczego skryptu w tle.

Melebius
źródło
Należy pamiętać, że &>składnia jest przestarzała i należy ją zastąpić >/dev/null 2>&1 wiki-dev.bash-hackers.org/scripting/obsolete
multithr3at3d
4
@ multithr3at3d A Bashism niezgodny z POSIX? Pewnie! Przestarzałe czy przestarzałe? Nie , niezależnie od tego, co myślą trzej autorzy tej listy ostatnio edytowanej w 2015 roku. Jest to krótka forma, a skrócenie linii poleceń jest tutaj dokładnie celem OP. Jeśli ktoś uruchomi #!/bin/bashskrypt w innej powłoce bez uprzedniego sprawdzenia przenośności, to zdecydowanie nie jest to wina Basha, jeśli nie działa.
deser
12

Napisałem funkcję i umieściłem ją w moim, .bashrcaby uruchamiała rzeczy odłączone od mojego terminala:

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

... i wtedy:

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

A ponieważ jestem leniwy, napisałem też skrót do xdg-open:

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

Ponieważ xdg-openoczekuje dokładnie jednego argumentu, funkcja xoiteruje wszystkie podane argumenty i wywołuje xdg-openkażdy z nich osobno.

Pozwala to na:

detach google-chrome
xo . ~/Reference/topic_regex.md
PerlDuck
źródło
5

Możesz przekierować wyjście dla wszystkich kolejnych poleceń za pomocą

exec 1>/dev/null
exec 2>/dev/null
o nie
źródło
3

Możesz utworzyć pętlę i podać jej polecenia jako argumenty:

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

Zauważ, że w ten sposób dokładnie tak, jak w przypadku metody podpowłoki z nawiasami klamrowymi, możliwe jest podsumowanie wyników i przekierowanie ich wszystkich naraz.

deser
źródło
3

Utworzyłem specjalny plik, taki jak /dev/nullkrótsza ścieżka, aby skrócić przekierowanie. Użyłem /njako ścieżki nowego pliku:

sudo mknod -m 0666 /n c 1 3

W ten sposób możesz skrócić poszczególne linie, np. Do:

google-chrome &>/n &

Źródło: Jak utworzyć / dev / null?

deser
źródło