为什么使用“&”运行 Linux shell 命令?

Geo*_*ge2 30 linux shell

我使用的是 Red Hat Linux Enterprise 版本 5。我注意到人们有时会运行带有几个&选项的命令。例如,在下面的命令中,有两个&标志。他们的目的是什么?它们总是与 nohup 一起使用吗?

nohup foo.sh <script parameters> >& <log_file_name> &
Run Code Online (Sandbox Code Playgroud)

Mar*_*ini 32

在 Bash shell 脚本中,与号“&”用于派生进程:

find -name hello &
Run Code Online (Sandbox Code Playgroud)

它会导致 find 命令被派生并在后台运行(你总是可以通过它的 PID 杀死它)。


kma*_*rsh 26

为什么使用“&”运行 Linux shell 命令?

立即返回提示,并在后台运行该过程。

它们的作用是什么?

即使在用户注销(或退出启动 shell)后,nohup 也允许后台进程继续运行。

>& 将标准输出和标准错误都重定向到日志文件中。

&在后台运行整个事情,立即给你提示。

解释:

每个 Linux 进程打开三个 I/O 通道,一个输入“stdin”,一个标准输出“stdout”和一个标准错误输出“stderr”。它们可用于二进制,但它们传统上是文本。当大多数程序看到 stdin 关闭时,它们会退出(这可以由程序员更改)。

当父 shell 退出时,子进程的 stdin 关闭,并且(通常,通常)子进程也退出。此外,孩子们会收到一个软件信号 SIGHUP,表明用户已经“挂断”(以前是调制解调器),这里的默认设置也是退出。(注意,程序员可以在编写程序时更改所有这些)。

所以,nohup 所做的是给子进程一个单独的 I/O 环境,将来龙去脉与未绑定到父 shell 的东西捆绑在一起,并使子进程免受 SIGHUP 信号的影响。一旦用户断开连接,您将看到 init(进程 1)拥有的 nohup 后台进程,而不是用户的 shell。

但是,nohup如果进程在前台运行,则无法完全完成这项工作,因此&用于在后台运行程序,无论是否有用户登录,它都可以愉快地保持运行。


Den*_*son 15

除了 Martin、Ash 和 Kevin 的答案之外,有时您还会看到在数学上用于按位 AND *的&符号:

$ echo $(( 11 & 7 ))
3
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉位运算符:

11: 1011
 7: 0111
-------- AND
 3: 0011
Run Code Online (Sandbox Code Playgroud)

在每个位置,第一个数字和第二个数字中都有一个位,在答案中将该位设置为 1。

* Kevin 的答案中的功能称为逻辑与。

详细说明 Ash 的答案,当用于重定向时,&符号可以告诉 shell 复制文件描述符。在这个命令中echo "hello" > outputfile 2>&1,&符号导致任何可能进入标准错误(stderr,文件描述符2)的输出与标准输出(stdout,文件描述符1,左侧的默认值>)相同。该>& outputfile运营商的简写> outputfile 2>&1

此外,在击4新,也有在对条款两个新的终止case命令;&;;&影响的情况下是否“下落通过”,如果是这样,是否进行下一个测试。

  • 乔治:如果你不使用 &amp;,那么你将永远不会得到提示去做其他任何事情。终端将“挂起”,直到进程(无论它是什么)完成或终止/终止。&amp; 保证进程在后台运行。但是,如果您注销,操作系统将终止您的所有进程,这也会杀死您的后台进程。如果您使用 *nohup*,您是在告诉进程“忽略将终止您的命令”。 (2认同)

Ash*_*Ash 13

除了@Martin 的回答:与号的另一种用法(>&如上)是同时捕获 stdoutstderr。通常,如果您将输出重定向到一个只有 '>' 的文件,您只会得到输出到stdout,而忽略任何错误。