Answers:
&
命令末尾的结尾运算符用于将命令置于后台。这实际上是POSIX标准指定的标准语法:
异步列表
如果命令由控制操作符('&')终止,则外壳程序应在子外壳程序中异步执行命令。这意味着外壳程序在执行下一个命令之前不应等待命令完成。
在后台运行命令的格式为:
command1&[command2&...]
后台命令的目的是在脚本或交互式外壳程序中没有主外壳程序等待命令的情况下运行命令,这将阻止其他命令的执行,并给用户带来不便。这对于启动长时间运行的命令很方便,但是您需要在当前Shell中继续工作。您可以猜到,这是由于当时没有多标签终端仿真器,但是终端是连接到计算机本身的实际物理硬件。
从定义中您可以看到,它&
也像命令一样充当命令列表的命令终止符;
。在您的特定示例中,pyprogramm >> /dev/null 2>&1 &
列表中只有一个命令。
更普遍,
echo Hello ; echo World ;
和
echo Hello & echo World &
是由;
和&
运算符终止的列表的两个示例。区别在于,如果禁用了作业控制,则&
终止列表将连接到输入/dev/null
:
如果禁用了作业控制(请参阅set -m),则在执行任何显式重定向之前,应将异步列表的标准输入视为已分配给与/ dev / null具有相同属性的文件。如果启用了作业控制,则不会发生这种情况。在所有情况下,标准输入的显式重定向都将覆盖此活动。
但是,在顺序列表中,stdin
如果没有显式重定向,则每个命令仍连接到终端。
还要注意,根据我们前面提到的定义,该&
命令在subshell中执行命令。相反,;
终止列表在当前shell中执行。退出状态也有所不同。对于&
标准说:
异步列表的退出状态应为零。
当您要在后台放置多个命令时,这非常重要。在编写脚本或命令时,您将必须选择不关心它们是否失败的命令,或者必须找到一种处理非零(错误)退出状态的方法。在您的特定示例中,pyprogramm >> /dev/null 2>&1 &
在后台运行应该以某种方式指示其是否失败,但是判断您使用的2>&1
是通过重定向隐藏错误输出,并且您可能会认为脚本应该不会失败。
相比之下,;
退出状态定义为:
顺序列表的退出状态应为列表中最后一条命令的退出状态。
同样,这将影响您如何在命令行中编写命令的顺序列表,以及如果列表中的某些命令失败,您希望如何处理事情。
事实上,这是POSIX定义是指所有类似Bourne外壳,意义bash
,dash
以及ksh
必须支持它。
&
重定向中的&
命令不同于命令终止符。这意味着复制(复制)文件描述符对象。请参阅输出重定向中的确切含义是什么?
在bash
其中也有|&
运算符(请注意,在管道和“与”号之间没有空格)。从bash手册:
如果使用|&,则命令的标准错误,除了其标准输出外,还通过管道连接到command2的标准输入;它是2>&1 |的简写。将标准错误隐式重定向到标准输出是在命令指定的任何重定向之后执行的。
&
隐藏输出的说法听起来不正确。您引用的标准中的段落表示输入,而不是输出。区分是否启用作业控制的原因是,尝试从tty读取的后台进程将被挂起。那时,您需要使用作业控制将其放在前台,以提供正在等待的输入。没有作业控制就无法完成所有这些操作,因此,如果禁用了作业控制,则需要从stdin/dev/null
或等效位置重定向stdin 。