为什么要使用‘&’运行 Linux shell 命令?

为什么要使用‘&’运行 Linux shell 命令?

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

nohup foo.sh <script parameters> >& <log_file_name> &

答案1

除了马丁、阿什和凯文的答案之外,有时您会看到在数学上用于按位与* 的“与”符号:

$ echo $(( 11 & 7 ))
3

如果您不熟悉位运算符:

11: 1011
 7: 0111
-------- AND
 3: 0011

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

* Kevin 的回答中的这个功能被称为逻辑和。

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

此外,Bash 4 中新增了两个用于命令和子句的新终止符case;&它们;;&会影响某个案例是否“失败”,如果是,则影响是否执行下一个测试。

答案2

在 Bash shell 脚本中,使用与号“&”来分叉进程:

find -name hello &

它将导致 find 命令分叉并在后台运行(您可以随时通过其 PID 将其终止)。

答案3

为什么要使用‘&’运行 Linux shell 命令?

立即得到您的提示,并在后台运行该过程。

它们各有什么作用?

禁止允许后台进程在用户注销(或退出启动 shell)后继续运行。

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

&在后台运行整个过程,并立即给你返回提示。

解释:

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

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

因此,nohup 所做的就是为子进程提供一个单独的 I/O 环境,将输入和输出绑定到与父 shell 无关的某些东西上,并保护子进程免受 SIGHUP 信号的影响。一旦用户断开连接,您将看到 init(进程 1)拥有的 nohup 后台进程,而不是用户的 shell。

但是,nohup如果进程在前台运行,则无法完全完成工作,因此&习惯在后台运行该程序,无论是否有用户登录,它都可以正常运行。

答案4

除了 Martin 和 Ash 的回答之外,有时您可能会看到使用 token &&。这用于表示“当且仅当第一个命令成功运行时才运行第二个命令。”如果命令编写得当,如果出现任何错误,则不会成功退出。

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$

相关内容