Bash 等待命令

2023-10-27

wait是等待给定作业完成并返回的命令退出状态等待的命令。

自从wait命令影响当前 shell 执行环境,它在大多数 shell 中作为内置命令实现。

在本文中,我们将探讨 Bash 内置功能wait命令。

Bash wait命令#

的一般语法wait内置采用以下形式:

wait [options] ID

ID是进程或作业 ID。如果不ID指定后,该命令将等待所有子后台作业完成。

The wait命令返回等待的最后一个命令的退出状态。

例如,等待具有 PID 的后台进程7654,你会使用:

wait 7654

当给出多个进程时,该命令等待所有进程完成。

作业是使用作业规范(“jobspec”)来指定的,这是一种引用构成作业的流程的方式。职位规范以百分比符号开头,后跟职位编号 (%n)。这是一个例子:

在后台运行命令 :

rsync -a /home /tmp/home &

shell 作业 ID(用括号括起来)和进程 ID 将显示在您的终端上:

[2] 54377

要等待作业,请运行wait命令后跟作业规范:

wait %2

当用-n选项,该命令仅等待给定 pid 或 jobspec 中的单个作业完成并返回其退出状态。如果没有提供参数,wait -n等待任何后台作业完成并返回作业退出状态。

wait -n 45432 54346 76573

在上面的例子中,wait -n只打印最先退出的作业的返回状态;它不显示作业的 PID。如果您想获取返回退出状态的作业 pid 或作业规范,请使用-p将其分配给变量的选项:

wait -p job_id -n 45432 54346 76573

-pBash 5.1 中引入了该选项。如果您使用较旧的 Bash 版本,您将收到“无效选项”错误。

The -f选项告诉wait在返回其退出代码之前等待每个 pid 或 jobspec 实际终止,而不是在作业状态更改时返回。该选项仅在启用作业控制时有效。默认情况下,仅针对交互式提示启用作业控制。

例子#

wait通常用在生成并行执行的子进程的 shell 脚本中。

为了说明该命令的工作原理,请创建以下脚本:

#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"

我们逐行解释一下代码:

  1. 第一行称为 shebang,告诉操作系统使用哪个解释器来解析文件的其余部分。
  2. 我们正在使用sleep命令来模拟耗时的后台进程。
  3. $!是一个内部 Bash 变量,用于存储最后一次在后台运行的作业的 PID。在此示例中,这是sleep命令。我们将 PID 存储在变量中(process_id).
  4. 打印 PID 号。
  5. PID 被传递到wait等待直到的命令sleep命令完成。
  6. 打印退出状态wait命令。$?是一个内部 Bash 变量,保存最后执行的命令的退出状态。

如果运行该脚本,它将打印如下内容:

PID: 36353
Exit status: 0

这里有一个使用的例子-n option:

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

当脚本执行时,它会产生 3 个后台进程。wait -n等待第一个作业完成并打印 echo 语句。wait等待所有子后台作业完成。

first job completed
all jobs completed

最后一个例子解释了-f选项。打开终端并运行:

sleep 3600 &
[1] 46671

等待过程:

wait 46671

打开另一个终端并使用以下命令停止该进程kill命令:

kill -STOP 46671

一旦进程状态发生改变,wait命令将完成并返回进程退出代码。

现在,重复相同的步骤,但这次使用wait -f $pid:

sleep 3600 &wait -f 46671

从另一个终端停止该进程:

kill -STOP 46671

这次的wait命令将无法完成。它将运行直到sleep进程终止。

结论#

The wait命令等待指定作业完成并返回作业的退出代码。

如果您有任何问题或反馈,请随时发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 等待命令 的相关文章

  • Bash 循环遍历具有行和列的变量

    经过几个小时的搜索测试不同的解决方案后 我尚未找到可行的解决方案 Bash 和 Shell 脚本不是我的强项 我有一个变量 其中有行 换行 和列 制表符分隔 我想要做的是循环遍历行并获取 Column X 然后将该项目放入变量中 以便我可以
  • 如何检查软件包是否已安装并在未安装时安装它?

    我正在 Ubuntu 系统上工作 目前这就是我正在做的事情 if which command gt dev null then echo e Command not found Install y n c read if REPLY y t
  • 仅当程序成功时如何重定向程序的输出?

    当我的程序之一返回非零退出代码时 我想避免重定向其输出 这可能吗 如果可以 我该怎么做 我失败的尝试 echo foo gt file false cat gt file 这导致file是空的 我想要的行为只是调整file当程序成功时 我还
  • Bash:执行命令时超时/文件溢出终止

    我正在用 bash 编写一个模拟评分脚本 它应该执行一个 C 程序 该程序将给出一些输出 我将其重定向到一个文件 我试图 1 使其在一定持续时间后超时 并且 2 如果输出文件到达某个文件则终止尺寸限制 不知道如何解决这两个问题 有什么帮助吗
  • 如何在 Bash 脚本中回答“是”

    有一个快速的问题 想象一下我有这样的代码 mkdir p INSTALLDIR sudo apt get install y git clojure leiningen git clone git github com maltoe sto
  • Linux Bash - 日期格式

    我的日期格式是 yyyy mm dd hh mm ss 如何检查我的输入 它应该是这样的 bin bash read p Date format yy mm dd HH MM SS input check date Y m d H M S
  • 比较两个文件的各自字段并以特定格式输出所需的内容

    我正在比较两个文件 food1 txt 文件并比较 food2 txt 文件 如下所示 cat food1 txt pizza 1ea chicken 5ea tooboo 4ea orange 2ea cat food2 txt pizz
  • bash 中的 SIGINT 和进程替换

    我发现如果我有类似的东西 usr bin env bash function abort politely echo Aborting politely sleep 5 touch stop trap abort politely SIGI
  • 具有此处文档重定向的 Makefile 配方

    有谁知道如何在菜谱上使用此处文档重定向 test sh lt
  • 如何使用终端打开“-”虚线文件名?

    我尝试了 gedit nano vi leafpad 和其他文本编辑器 它无法打开 我尝试了 cat 和其他文件查找命令 我向你保证这是一个文件而不是目录 这种方法有很多误解 因为使用 作为参数指的是标准输入 标准输出 i e 开发 标准输
  • 为什么 iTerm2 中不显示 git 颜色

    所以我有我的 gitconfig 设置来处理颜色 在终端中它工作得很好 看起来也不错 然而 在 iTerm2 中 除非我为 git 设置反向属性 否则我的 gitconfig 根本不会显示颜色 然后它们就出现了 但是谁喜欢相反的颜色呢 为什
  • grep 以特定字符串开头的行

    我想找到文件中以特定字符串开头的所有行 问题是 我事先不知道字符串里有什么 该值存储在变量中 天真的解决方案如下 grep my string file txt 因为如果 Bash 变量my string包含任何正则表达式特殊字符 grep
  • 如何在shell脚本中扩展相对路径

    我正在编写一个脚本来使用 bash 在 linux 2 6 上设置环境变量 因此该脚本包含如下命令 export SRC DIR export LIBPATH SRC DIR lib 问题是 当我尝试 echo LIBPATH 时 它显示
  • C - printf("\a") 不会发出警报[重复]

    这个问题在这里已经有答案了 这是我的 C 代码 include
  • OS X bash:目录名

    我想创建一个简单的 bash 脚本来在 OS X 上启动 Java 程序 文件名 文件路径和直接工作文件夹都包含空格 当我这样做时 bin sh cd dirname 0 I get usage dirname path 我也尝试过在各种不
  • 移动除一个文件之外的所有文件

    如何移动除一个文件之外的所有文件 我正在寻找类似的东西 mv Linux Old Tux png Linux New 我将旧的东西移动到新的东西文件夹中 除了Tux png 符号代表否定 有一些工具可以完成这项工作吗 如果您使用 bash
  • 更改 iterm2 中的用户名、主机名和路径颜色

    如何更改 iTerm2 中的用户名 主机名和路径颜色 我正在使用内置的 Solarized 配色方案 In Ubuntu the same built in colorscheme is highlighted like In iTerm2
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • shell脚本响应按键

    我有一个 shell 脚本 本质上是这样的 while true do read r input if input a then echo hello world fi done 这一切都很好 但我刚刚意识到在这种情况下必须按 ENTER
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h

随机推荐

  • TypeError: parse() got an unexpected keyword argument 'transport_encoding'

    pip install XXX 出现问题 TypeError parse got an unexpected keyword argument transport encoding 解决方法 conda install pip
  • 如何在 Git 中创建空分支(无父分支)

    Git 是一个强大的版本控制系统 使开发人员能够跟踪其代码库中的更改并有效地管理其项目 Git 的关键功能之一是分支 它允许开发人员创建代码库的单独版本并同时处理它们 在本文中 我们将了解如何使用 Git 创建空分支 orphan opti
  • 如何在 Ubuntu 18.04 上安装和配置 VNC 服务器

    VNC 代表 虚拟网络计算 是一组用于远程共享桌面系统的协议 有许多软件可用于远程访问基于 Linux 的桌面 包括 TigerVNC TightVNC Vino vnc4server 等等 TigerVNC 是一款免费 开源 高性能的 V
  • 如何在 Shell 脚本中为用户分配密码

    Command 回声 passwd stdin 例子 使用以下命令在 shell 脚本中更改用户 jack 的密码 例如我们使用字符串密码作为密码 echo password passwd stdin jack 分配用户输入密码 使用以下命
  • 如何在 Ubuntu 20.04 上安装 Google Cloud SDK

    谷歌云SDK 软件开发套件 提供了一组用于管理 Google Cloud Platform GCP 上托管的资源的工具 SDK 提供 gcloud gsutil 和 nd bq 命令 能够通过终端访问 Google Cloud Cloud
  • 如何在 Fedora 上安装 Apache Solr

    Apache Solr 是一个基于名为 Lucene 的 Java 库构建的开源搜索平台 Solr 是一个流行的网站搜索平台 因为它可以索引和搜索多个网站 并根据搜索查询的分类返回相关内容的推荐 本指南将引导您完成在 Fedora 系统上安
  • 如何在Linux中使用zip命令

    The zipLinux 中的命令是一个实用程序 用于将一组文件打包到 zip 存档中 zip 命令还可以用于压缩文件 从而减少它们在计算机硬盘上占用的空间 此外 zip命令可用于加密文件 使未经授权的用户更难以访问zip存档的内容 要解压
  • 如何在 Django 中设置环境变量

    Django 是基于 Python 构建的强大 Web 框架 提供开箱即用的强大功能 它最重要但有时被忽视的功能之一是它能够使用环境变量处理配置 环境变量提供了一种在代码库之外设置配置的方法 从而提供更好的安全性和灵活性 本文旨在简化 Dj
  • Linux 中的 dig 命令及有用示例

    dig 代表 Domain Information Groper 是一个用于收集域名服务器信息的命令行网络工具 dig 命令是另一个强大的工具 类似于nslookup用于诊断 dns 相关问题 我们可以使用 dig 命令查询各种 dns 服
  • 在 Apache 中启用 .htaccess 的综合指南:配置、最佳实践和用例

    htaccess 文件是一个功能强大的配置工具 允许您控制和自定义 Apache Web 服务器上网站行为的各个方面 本指南将介绍如何在 Apache 中启用 htaccess 讨论最佳实践并提供常见用例示例 以帮助您充分利用此功能 1 了
  • 如何在 cPanel/WHM 中全局启用 Gzip 压缩

    Apache mod deflate模块负责 DEFLATE 输出过滤器 允许服务器的输出在通过网络发送到客户端之前进行压缩 mod deflate是替代mod gzip它与旧版本的 Apache 一起使用 仅具有 cPanel 访问权限的
  • JavaScript 中 var、let 和 const 有什么区别?

    变量声明只是告诉计算机变量存在以及它应该以什么值开始 与其他编程语言类似 JavaScript 也允许声明变量 JavaScript 中可以使用三个关键字来声明变量 let var 和 const 每个关键字对于如何使用它们创建的变量都有不
  • 升级 Fedora:分步教程

    如果您是 Fedora 的新用户 您可能不知道它有不同的版本 Fedora 的最新版本称为 主 版本 也称为 当前 版本 这意味着开发人员发布了以前的版本 用户可以从较低版本升级到该版本 在本文中 我们将了解如何升级 Fedora 版本 继
  • 如何在 Windows 上创建可启动 CentOS U 盘

    本教程将引导您完成在 Windows 上创建可启动 CentOS USB 记忆棒的过程 您可以使用此 USB 记忆棒在任何支持从 USB 启动的计算机上启动并测试或安装 CentOS 先决条件 8GB 或更大的 USB 记忆棒驱动器 Mic
  • 如何在 Ubuntu 20.04 上安装 Go

    Go 通常被称为golang是由 Google 创建的现代开源编程语言 可让您构建可靠且高效的应用程序 Go 是一种编译语言 这意味着您需要编译源代码以创建用于运行软件的可执行文件 许多流行的应用程序 例如 Kubernetes Docke
  • 如何在 Ubuntu 20.04 上安装 Atom 文本编辑器

    Atom是由 GitHub 开发的开源 跨平台代码编辑器 它有一个内置的包管理器 嵌入Git控制 智能自动完成 语法突出显示和多个窗格 从本质上讲 Atom 是一个基于 Electron 构建的桌面应用程序 使用 HTML JavaScri
  • 创建 Linux 交换文件

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 大多数情况下 在虚拟机上运行 Linux 时 不存在交换分区
  • 如何在 Vim / Vi 中删除行

    Vim 或其前身 Vi 预装在大多数 Linux 发行版和 macOS 上 如果您是系统管理员或普通 Linux 用户 了解 Vim 的基础知识非常重要 很多时候 在处理文本文件时 您需要删除一行或多行 本文介绍如何在 Vim Vi 中删除
  • 如何使用 Linux 命令行文本编辑器 Nano

    使用命令行时 您经常需要创建或编辑文本文件 Vim 和 Emacs 是两个最强大和流行的命令行编辑器 它们都有一个陡峭的学习曲线 可能会让新用户感到害怕 对于那些需要简单编辑器的人来说 有 nano GNU nano 是一款适用于 Unix
  • Bash 等待命令

    wait是等待给定作业完成并返回的命令退出状态等待的命令 自从wait命令影响当前 shell 执行环境 它在大多数 shell 中作为内置命令实现 在本文中 我们将探讨 Bash 内置功能wait命令 Bash wait命令 的一般语法w