我使用的是 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 ~]$