Reduza ou mescle várias linhas de `&> / dev / null &`

11

Sempre que inicio a máquina, eu executo o seguinte programa:

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

Pesado &> /dev/null &... Como eu poderia encurtar a lógica?

Cálculo
fonte
2
Você pode colocar todos ou a maioria desses programas nos aplicativos de inicialização .
Pausado até novo aviso.
aplicação excelente e fantástica. Os erros geralmente ocorriam no gnome-session causando falhas abruptas, então eu os inicio no servidor tmux. @DennisWilliamson
Cálculo

Respostas:

12

A parte &> /dev/nullsignifica redirecionamento de saída. Você pode redirecionar vários comandos para o mesmo arquivo, agrupando-os em um bloco:

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

A mesma coisa, no entanto, não pode ser usada para iniciar comandos individuais em segundo plano ( &). Colocar &após o bloco significaria executar o bloco inteiro como um único script em segundo plano.

Melebius
fonte
Observe que a &>sintaxe está obsoleta e deve ser substituída por >/dev/null 2>&1 wiki-dev.bash-hackers.org/scripting/obsolete
multithr3at3d
4
@ multithr3at3d Um bashismo incompatível com o POSIX? Certo! Preterido ou obsoleto? Não , independentemente do que pensam os três autores desta lista editados pela última vez em 2015. É uma forma abreviada, e encurtar as linhas de comando é exatamente o objetivo do OP aqui. Se alguém executa um #!/bin/bashscript em um shell diferente sem primeiro verificar a portabilidade, definitivamente não é culpa do Bash se não funcionar.
dessert
12

Eu escrevi uma função e a coloquei no meu .bashrcpara executar coisas desanexadas do meu terminal:

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

... e depois:

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

E como sou preguiçosa, também escrevi um atalho para xdg-open:

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

Como xdg-openespera exatamente um argumento, a função xorepete todos os argumentos fornecidos e chama xdg-opencada um separadamente.

Isso permite:

detach google-chrome
xo . ~/Reference/topic_regex.md
PerlDuck
fonte
5

Você pode redirecionar a saída para todos os comandos subseqüentes com

exec 1>/dev/null
exec 2>/dev/null
Ah não
fonte
3

Você pode criar um loop e fornecer os comandos como argumentos:

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

Observe que, assim como na abordagem de subshell com chaves, é possível resumir as saídas e redirecionar todas elas de uma só vez.

sobremesa
fonte
3

Eu criei um arquivo especial como /dev/nullum caminho mais curto para diminuir o redirecionamento. Eu usei /ncomo o novo caminho do arquivo:

sudo mknod -m 0666 /n c 1 3

Dessa forma, você pode reduzir as linhas individuais para, por exemplo:

google-chrome &>/n &

Fonte: Como criar / dev / null?

sobremesa
fonte