shell 脚本行末尾的&符号是什么意思?

use*_*951 146 shell

sh sys-snap.sh &
Run Code Online (Sandbox Code Playgroud)

什么是sh?什么是sys-snap.sh?为什么我应该放在&行尾?谁能解释一下语法?

如果没有&脚本,在我按下Ctrl+之前,脚本不会返回到提示C。随着&我可以按回车,它的工作原理。

jof*_*fel 117

sh是默认的Bourne 兼容 shell(通常是 bash 或 dash)

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

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

  • @CharlieParker 是的,“&&”是“and”函数。&& 之后的命令只有在之前的命令成功时才会调用。示例“true && echo works”输出“有效”,但“false && echo no output”不调用echo 函数。 (8认同)
  • 在基于 Linux 的系统(或最近的 OS/X)中,`sh` 通常只有 `bash` 或 `dash`。在 BSD 上,它通常是 Ash 的另一种变体(dash 基于 NetBSD sh,本身基于 Almquist Shell)或 pdksh 衍生物。在商业 Unices 上,它通常是 ksh88。 (4认同)
  • @Hussain7 Ctrl-C 总是发送到前台的当前进程。如果 shell 脚本以 `&` 开始,因此在后台,你只会得到一个新的 shell 提示。 (2认同)
  • 双与号`&&` 与单与号`&` 不同吗? (2认同)

Dra*_*oan 109

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

您可以查看当前使用该jobs命令运行的作业列表。您可以使用该命令返回到该命令(带到“前台”)fg。其拉命令回到你看到没有任何提示的状态,你必须问题Ctrl-C的过程。但是,您可以暂停(暂停)该进程,发出Ctrl- Z。这将暂停sys-snap.sh并使您返回到提示。然后,您可以背景,(仿佛你已发出它具有&)与bg命令,它会继续运行,从它的暂停状态Ctrl-Z已经把它英寸

请注意,您一次可以拥有多个作业(如 所示jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &
Run Code Online (Sandbox Code Playgroud)

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

fg %1

将放回sys-snap.sh前台,而留another-script.sh在后台。

您可以向正在运行的作业发出Ctrl-C序列,而无需使用kill命令kill %1将它们置于前台,将发送相当于Ctrl- Cto 的内容sys-snap.sh

如果您使用的是 bash shell,则该man bash命令在标题为“JOB CONTROL”的部分下有一个详细部分,将详细介绍。

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

的功能部分sys-snap.sh(当您使用类似less命令查看其内容时)是Shebang。在第一行,您可能会找到以下之一:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash
Run Code Online (Sandbox Code Playgroud)

或类似。在基本术语中,运行#!(例如/bin/sh)之后的命令,并且一次一行地将脚本文件其余部分的内容提供给它。请注意,该文件还必须设置为可执行文件,chmod以便您可以将其作为命令运行。如果未设置权限,则shebang无效,因为您可能会收到以下错误:

bash: sys-snap.sh: command not found
Run Code Online (Sandbox Code Playgroud)

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

bash: ./sys-snap.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

/bin/sh sys-snap.sh &
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案。一个可能的建议是还添加 `nohup` 的功能,因为它通常与 `&` 结合使用来启动一个进程,并且能够在不终止进程的情况下终止启动它的 shell。 (3认同)
  • 请注意,在命令末尾使用“&”只会分离“stdin”(而不是“stdout”或“stderr”),这意味着如果您的命令/脚本在后台运行但写入“stdout”,您可能会运行进入“Ctrl + c”不会停止输出但您可以输入命令的情况。这是因为后台进程正在写入“stdout”,但您无法阻止它,因为它没有在前台运行。更多信息[此处](https://superuser.com/questions/972968/why-does-a-background-process-started-in-bash-print-stdout-to-screen)。 (2认同)

fro*_*utz 6

sh是一个外壳。具体使用哪个 shell 取决于系统。bash使用作为标准 shell 的系统示例:

$ 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)
Run Code Online (Sandbox Code Playgroud)

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

&将导致 shell 进程在后台运行。如果没有,&它将停留在前台直到脚本结束。无论哪种方式,脚本都会工作,只是在执行进一步的命令之前等待脚本结束或不结束的问题。