Acortar o fusionar varias líneas de `&> / dev / null &`

11

Cada vez que inicio la máquina, ejecuto el siguiente 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 &

Incómodo &> /dev/null &... ¿Cómo podría acortar la lógica?

Cálculo
fuente
2
Puede poner todos o la mayoría de esos programas en sus Aplicaciones de inicio .
Pausado hasta nuevo aviso.
genial, fantástica aplicación. Por lo general, se produjeron errores en gnome-session que causaron fallas bruscas, por lo que los inicio desde el servidor tmux. @DennisWilliamson
Cálculo

Respuestas:

12

La parte &> /dev/nullsignifica redirección de salida. Puede redirigir múltiples comandos al mismo archivo agrupándolos en un bloque:

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

Sin embargo, lo mismo no se puede usar para iniciar comandos individuales en segundo plano ( &). Poner &después del bloque significaría ejecutar todo el bloque como un solo script en segundo plano.

Melebio
fuente
Tenga en cuenta que la &>sintaxis está en desuso y debe reemplazarse con >/dev/null 2>&1 wiki-dev.bash-hackers.org/scripting/obsolete
multithr3at3d
44
@ multithr3at3d ¿Un bashismo incompatible con POSIX? ¡Seguro! ¿En desuso u obsoleto? No , independientemente de lo que piensen los tres autores de esta lista editados por última vez en 2015. Es una forma corta, y acortar las líneas de comando es exactamente el objetivo de OP aquí. Si alguien ejecuta un #!/bin/bashscript en un shell diferente sin verificar primero la portabilidad, definitivamente no es culpa de Bash si no funciona.
postre
12

Escribí una función y la puse en mi .bashrcpara ejecutar cosas separadas de mi terminal:

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

... y entonces:

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

Y como soy flojo, también escribí un atajo para xdg-open:

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

Como xdg-openespera exactamente un argumento, la función xoitera sobre todos los argumentos dados y llama xdg-opena cada uno por separado.

Esto permite:

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

Puede redirigir la salida para todos los comandos posteriores con

exec 1>/dev/null
exec 2>/dev/null
Oh no
fuente
3

Podría crear un bucle y asignarle los comandos como argumentos:

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

Tenga en cuenta que de esta manera, exactamente como con el enfoque de subshell con llaves, es posible resumir los resultados y redirigirlos todos a la vez.

postre
fuente
3

Creé un archivo especial como /dev/nullcon una ruta más corta para acortar la redirección. Utilicé /ncomo la ruta del nuevo archivo:

sudo mknod -m 0666 /n c 1 3

De esta manera, puede acortar las líneas individuales para, por ejemplo:

google-chrome &>/n &

Fuente: ¿Cómo crear / dev / null?

postre
fuente