Shell脚本行末的“&”号是什么意思?


118
sh sys-snap.sh &

什么sh啊 什么sys-snap.sh啊 为什么我要放在&行尾?谁能解释语法?

没有&脚本,直到按Ctrl+ 之前脚本都不会返回到提示C。随着&我按下Enter键,它的工作原理。


2
双“&”号&&与单“&”号有区别&吗?
查理·帕克

1
@CharlieParker您是否找到了答案?我试图自己找出区别。(编辑:Nevermind,发现它的位置更深)
Drazen Bjelovuk

Answers:


94

sh是默认的Bourne兼容外壳(通常为bash或破折号)

sys-snap.sh是一个shell脚本,其中包含sh执行的命令。由于您不发布其内容,因此只能从其名称猜测其作用。我可以找到与CPanel相关的具有相同文件名的脚本,该脚本将创建一个包含所有当前进程,当前内存使用情况,数据库状态等的日志文件。如果该脚本以shebang行#!/bin/sh或类似名称)开头,则可以使其可执行与chmod +x sys-snap.sh直接使用启动它./sys-snap.sh,如果它是在当前目录。

由于&进程是在后台启动的,因此您可以继续使用外壳程序,而不必等到脚本完成。如果您忘记了它,可以使用停止当前正在运行的进程,Ctrl-Z并使用bg(在或在前台fg)在后台继续 进行。有关更多信息,请参见作业控制。


4
sh在通常只bashdash在基于Linux的系统(或最近的OS / X)。在BSD上,它通常是Ash的另一种变体(破折号基于NetBSD sh,其本身基于Almquist Shell)或pdksh派生。在商业Unices上,通常为ksh88。
斯特凡Chazelas

1
@jofel:如果下面的脚本正在运行并且错误地执行了Ctrl-C,该怎么办。我的脚本会执行还是会终止?例如:sh sys-snap.sh&
Hussain16年

2
@ Hussain7 Ctrl-C始终发送到前台的当前进程。如果shell脚本以开头&并因此在后台启动,则只会得到一个新的shell提示。
jofel

2
双“&”号&&与单“&”号有区别&吗?
查理·帕克

7
@CharlieParker是的,“ &&”是“ and”功能。&&之后的命令仅在成功之前的命令时调用。示例“ true && echo正常工作”输出“有效,但” false && echo no output”不会调用echo函数
。– jofel

87

这被称为job controlunix下。该&通知壳把命令在后台运行。这意味着它将继续运行该sys-snap.sh命令,但是将您返回到外壳程序,以允许您继续执行并行命令。

您可以看到当前正在使用该jobs命令运行的作业列表。您可以使用该命令返回命令(转到'foreground)fg。其拉命令回到你看到没有任何提示的状态,你必须发出Ctrl- C的过程。但是,您可以通过发出- 暂停(暂停)该过程。这将暂停并返回您的提示。然后,您可以后台它(仿佛你已发出它具有的)与命令,将简历从它运行已暂停状态- 已经把它英寸CtrlZsys-snap.sh&bgCtrlZ

请注意,您一次只能完成一项工作(如所示jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

您可以使用他们的工作编号(%1将为sys-snap.sh%2将为)为背景设置和前景设置another-script.sh。如果您使用fgbg不带参数它将对标工作的行动命令+jobs上面的输出。

fg %1

将放回sys-snap.sh前景,同时保留another-script.sh在背景中。

您可以向正在运行的作业发出Ctrl- C序列,而不必使用kill命令kill %1将它们前台化,它将发送等价的Ctrl- Csys-snap.sh

如果您使用的是bash shell,则该man bash命令的“作业控制”部分下有一个详细部分,以进行更详细的说明。

至于的名称sys-snap.sh,unix下的文件名是任意的(有一些例外,例如动态加载器文件)。不需要它们具有特定的文件扩展名以使它们作为Shell脚本运行,调用其他命令(例如perlphp等)。通常用于提供清晰度,在这种情况下,它是.sh使用Bourne Shell的Shell脚本。/bin/sh

Shebang是功能部分sys-snap.sh(当您使用less命令查看内容时)。在第一行中,您可能会发现以下情况之一:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

或类似。从根本上讲,运行#!(如/bin/sh)之后的命令,并且脚本文件其余部分的内容一次馈入一行。请注意,该文件还必须设置为可执行文件,chmod以便您可以将其作为命令运行。如果未设置权限,则shebang无效,因为您可能会得到以下错误:

bash: sys-snap.sh: command not found

或者如果您通过显式路径./sys-snap.sh.即当前工作目录)运行它,则会得到:

bash: ./sys-snap.sh: Permission denied

另一种选择是让它没有执行权限,并明确要求/ bin / sh运行它:

/bin/sh sys-snap.sh &

3
这是一个很好的答案。一个可能的建议是还添加nohup功能,因为它通常与&启动进程结合使用,并且能够杀死启动它的外壳而不会终止该进程。
2015年

@Drav,是真的,jobs如果它是第一个命令,它将总是返回空?
Pacerier '17

请注意,&仅在命令末尾使用会分离stdin(但不会分离stdoutstderr),这意味着如果您的命令/脚本在后台运行但正在写入stdout,您可能会遇到Ctrl + c无法停止输出但可以键入命令。这是因为后台进程正在写入,stdout但由于它不在前台运行而无法停止。更多信息在这里
vadasambar

4

sh是一个壳。哪个外壳完全取决于系统。bash用作标准外壳的系统示例:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.sh将是某种形式的shell脚本,因此sh sys-snap.sh将执行该shell脚本。

&将导致Shell进程在后台运行。如果没有&它,它将一直停留在前台,直到脚本结束。该脚本将以任何一种方式工作,这只是在执行其他命令之前等待脚本结束还是没有结束的问题。


1

您的服务器在hostgator中吗?

该脚本sys-snap.sh是由hostgator团队编写的特殊脚本,用于收集系统的所有日志文件和数据,因此他们将其输出用于监视和收集系统信息。


不,我没有使用hostgator。
user4951 13-10-25

1
@ J.Chang该脚本是HostGator和其他数百台主机使用的cPanel的一部分。
472084'7

@ 472084,哪个cpanel版本?
佩里耶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.