缩短或合并多行`&> /dev/null &`

Abs*_*cDo 15 command-line bash redirect background-process

每次启动机器时,我都运行以下程序:

$ 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 &
Run Code Online (Sandbox Code Playgroud)

繁琐&> /dev/null &......我怎么能缩短逻辑?

Mel*_*ius 16

该部分&> /dev/null表示输出重定向。您可以通过将多个命令分组到一个块中来将多个命令重定向到同一个文件:

#! /bin/bash
{
google-chrome &
lantern &
xdg-open . &
emacs  &
code ~/Programs/ &
xdg-open ~/Reference/topic_regex.md &
} &> /dev/null
Run Code Online (Sandbox Code Playgroud)

但是,同样的东西不能用于在后台启动单个命令 ( &)。放在&块之后意味着在后台将整个块作为单个脚本运行。

  • @multithr3at3d 与 POSIX 不兼容的 Bashism?当然!已弃用或过时?**不**,不管这份名单的三位作者最后一次编辑是在 2015 年是怎么想的。这是一个简短的形式,缩短命令行正是 OP 在这里的目标。如果有人在不同的 shell 中运行 `#!/bin/bash` 脚本而没有先检查可移植性,如果它不起作用,那绝对不是 Bash 的错。 (5认同)

Per*_*uck 14

我编写了一个函数并将其放入.bashrc我的终端中以运行与我的终端分离的东西:

detach () 
{ 
    ( "$@" &> /dev/null & )
}
Run Code Online (Sandbox Code Playgroud)

... 进而:

detach google-chrome
detach xdg-open ~/Reference/topic_regex.md
Run Code Online (Sandbox Code Playgroud)

而且因为我很懒,我还写了一个快捷方式xdg-open

xo () 
{ 
    for var in "$@"; do
        detach xdg-open "$var";
    done
}
Run Code Online (Sandbox Code Playgroud)

因为只xdg-open需要一个参数,该函数xo会遍历所有给定的参数并分别调用xdg-open每个参数。

这允许:

detach google-chrome
xo . ~/Reference/topic_regex.md
Run Code Online (Sandbox Code Playgroud)


ohn*_*hno 5

您可以使用以下命令重定向所有后续命令的输出

exec 1>/dev/null
exec 2>/dev/null
Run Code Online (Sandbox Code Playgroud)