Answers:
除了马丁,阿什和凯文的答案外,有时您还会看到在数学上用于与位*的“&”号:
$ echo $(( 11 & 7 ))
3
如果您不熟悉位运算符:
11: 1011
7: 0111
-------- AND
3: 0011
在每个位置的第一个数字和第二个数字中都有一个位,将答案中的该位设置为一个。
* Kevin答案中的功能称为逻辑 AND。
为了详细说明Ash的答案,在用于重定向符时,“&”号可以告诉Shell复制文件描述符。在此命令中echo "hello" > outputfile 2>&1
,“&”号会使可能出现标准错误(stderr,文件描述符2)的所有输出与标准输出(stdout,文件描述符1,左侧的默认值)一起到达同一位置>
。该>& outputfile
运营商的简写> outputfile 2>&1
。
另外,Bash 4中的新增功能在case
命令中有两个子句终止符;&
,;;&
它们会影响案例是否“掉线”,如果发生,则是否执行下一个测试。
>& filename
将stdout和stderr都输出到同一文件。如果您只想重定向stderr(并保留stdout),则可以这样做2> filename
。至于其他问题,您很可能会同时使用nohup
和&
。
logout
or exit
命令。
在Bash shell脚本中,“&”号用于派生进程:
find -name hello &
这将导致find命令被派生并在后台运行(您始终可以通过其PID杀死它)。
为什么用'&'运行Linux shell命令?
若要立即返回提示,请在后台运行该过程。
它们的功能是什么?
nohup允许后台进程即使在用户注销(或退出启动外壳程序)后仍继续运行。
>& 将标准输出和标准错误都重定向到日志文件中。
并在后台运行整个过程,立即提示您。
说明:
每个Linux进程都会打开三个I / O通道,一个输入“ stdin”,一个标准输出“ stdout”和一个标准错误输出“ stderr”。它们可以用于二进制,但传统上是文本。当大多数程序看到stdin关闭时,它们退出(程序员可以更改)。
当父shell退出时,stdin在子级上关闭,并且(通常,通常)子级也退出。此外,孩子们还会收到软件信号SIGHUP,它指示用户已“挂断”(以前是调制解调器),并且默认情况下也将退出。(请注意,程序员在编写程序时可以更改所有这些功能)。
因此,nohup的作用是为子进程提供一个单独的I / O环境,将输入和输出绑定到未绑定到父shell的东西上,并使子进程免受SIGHUP信号的影响。一旦用户断开连接,您将看到init拥有的nohup后台进程(进程1),而不是用户的外壳程序。
但是,nohup
如果该进程在前台运行,则无法完全完成该工作,因此&
被用于在后台运行程序,无论用户是否登录,该程序都可以在其中保持运行状态。
除了@Martin的答案之外:&符的其他用法(>&
如上所述)是同时捕获 stdout
和stderr
。通常,如果将输出重定向到仅包含'>'的文件,则只会将输出重定向到,而不会stdout
丢失任何错误。
除了Martin和Ash的答案以外,有时您可能还会看到&&
令牌的使用。用来表示“仅当第一个命令成功运行时才运行第二个命令”。编写正确的命令(如果有任何错误)将不会成功退出。
[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 ~]$
马丁的回答是好的,但有点含糊。该命令始终是派生和执行的,但是正常的shell行为是等待命令退出。“&”号将其放到后台,以便您返回终端提示,并可以执行其他操作。如果该进程将数据吐出到stdout或stderr,它将与您在提示符下所做的任何事情混在一起,并可能使您感到困惑。这就是为什么您使用>&/path/to/logfile.txt进行重定向。
响应George2,shell退出的正常行为是将SIGHUP信号发送到同一进程组中的所有进程(本质上是您生成的东西),它们通常会终止。如果即使关闭shell进程也希望继续执行此操作,则可以使用nohup命令使它们忽略此信号并继续运行。这种类型的进程有一个特殊的名称,称为守护进程(发音为“ demon”)。