Bash,eval 中的 CTRL+C 不会中断主脚本

2024-02-09

在我的 bash 脚本中,我正在运行存储在中的外部命令$cmd多变的。 (它可以是任何东西,甚至是一些简单的 bash oneliner。)

If ctrl+C is pressed while running the script, I want it to kill the currently running $cmd but it should still continue running the main script. However, I would like to preserve the option to kill the main script with ctrl+C when the main script is running.

#!/bin/bash
cmd='read -p "Ooook?" something; echo $something; sleep 4 ' 
while true; do
    echo "running cmd.."
    eval "$cmd"     # ctrl-C now should terminate the eval and print "done cmd"
    echo "done cmd"
    sleep 5         # ctrl-C now should terminate the main script
done

知道如何用一些不错的 bash 方式来做吗?

根据答案应用的更改:

#! /bin/bash

cmd='read -p "Ooook1?" something; read -p "Oook2?" ; echo $something; sleep 4 ' 
while true; do
    echo "running cmd.."
    trap "echo Interrupted" INT
    eval "($cmd)"     # ctrl-C now should terminate the eval and print "done cmd"
    trap - INT
    echo "done cmd"
    sleep 5         # ctrl-C now should terminate the main script
done

Now, pressing ctrl+C while "Ooook1?" read will break the eval only after that read is done. (it will interrupt just before "Oook2") However it will interrupt "sleep 4" instantly.

在这两种情况下,它都会做正确的事情 - 它只会中断 eval 子 shell,所以我们就快到了 - 只是那种奇怪的读取行为。


如果您有能力拥有eval部分在子 shell 中运行,您需要做的“所有”就是捕获 SIGINT。

#! /bin/bash

cmd='read -p "Ooook1?" something; read -p "Oook2?" ; echo $something; sleep 4 ' 
while true; do
    echo "running cmd.."
    trap "echo Interrupted" INT
    eval "($cmd)"     # ctrl-C now should terminate the eval and print "done cmd"
    trap - INT
    echo "done cmd"
    sleep 5         # ctrl-C now should terminate the main script
done

但不知道这是否适合您的特定需求。

$ ./t.sh 
running cmd..
Ooook1?^CInterrupted
done cmd
^C
$ ./t.sh 
running cmd..
Ooook1?qsdqs^CInterrupted
done cmd
^C
$ ./t.sh 
running cmd..
Ooook1?qsd
Oook2?^CInterrupted
done cmd
^C
$ 
GNU bash, version 4.1.9(2)-release (x86_64-pc-linux-gnu)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash,eval 中的 CTRL+C 不会中断主脚本 的相关文章

  • OSX 终端在启动时无法识别 ~/.bashrc 和 ~/.bash_profile

    OSX 识别我的 bashrc 和 bashprofile 的唯一方法是我在终端的首选项中指定启动时要定位的文件 他们没有按应有的方式工作有什么原因吗 这是我的 bashrc 的内部 s HOME rvm scripts rvm sourc
  • git push 无法在 cron 作业中工作

    我目前正在清理 CentOS 6 服务器上其他人留下的烂摊子 有一个应用程序需要每6小时备份一次到github帐户 有一个脚本负责准备数据并负责 git add 和 git commit git Push 由 expect 脚本负责 这样做
  • 使用终端(或 Shell)将文件的一部分复制/粘贴到另一个文件中

    我正在尝试将 txt 文件的一部分从行号 n 复制到行号 n y 假设 1000 到 1000000 我尝试过与运营商合作sed 并且失败了 这是我尝试过的命令 sed n 1000 1000000p path first file gt
  • 如何在 Linux/Unix 上根据文件类型添加文件扩展名?

    这是一个关于 Unix shell 脚本 任何 shell 的问题 但任何其他 标准 脚本语言解决方案也将受到赞赏 我有一个充满文件的目录 其中文件名是这样的哈希值 fd73d0cf8ee68073dce270cf7e770b97 fec8
  • 在 bash 中将 kB 和 GB 转换为 MB

    我使用 awk 和 sed 来获取表中的分区列表及其大小 我想用它来计算各个表的每日增量 这是我的输出 现在我正在努力将所有大小转换为 MB 匹配第二个字段中的数字并根据 MB 或 GB 字符串相乘的最佳 bash 方法是什么 201706
  • 在 bash 脚本中设置变量[重复]

    这个问题在这里已经有答案了 test sh 包含 A 1 B 2 我将 test sh 设置为 chmod 777 我用两个参数启动脚本 test sh first last 然后我通过输入以下内容对其进行了测试 echo FirstVar
  • 在Unix下,判断执行该程序的用户是否是root?

    我正在编写一个 rake 脚本 并希望检测 如果可能的话 使用 Ruby 而不是 bash 执行 rake 脚本的用户是否具有 root 权限 如果它不是 root 那么我想终止脚本 Use uid http www ruby doc or
  • 为什么 **sort** 不在每台机器上进行相同的排序?

    使用相同的sort具有相同输入的命令在不同的机器上产生不同的结果 我该如何解决这个问题 The man page http developer apple com documentation Darwin Reference ManPage
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • 如何为用户启用包括 sudo 在内的系统范围功能?

    我想为以下对象创建一个全局别名killprocessatport所以我最后放入 etc bash bashrc fuserfunction fuser KILL k n tcp 1 alias killprocessatport fuser
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • shell脚本中的“##”是什么意思? [复制]

    这个问题在这里已经有答案了 在编写脚本时 我遇到了这个命令 f file 我很想知道 什么是 这行是什么意思 In bash 它删除了前缀模式 在这里 它基本上为您提供了最后一个路径分隔符之后的所有内容 通过贪婪地删除前缀 后面跟随任意数量
  • 用于编译和运行 C++ 的 bash 脚本

    我正在尝试进入 C 但必须使用冗长的命令通过命令行运行东西很烦人 所以我想制作一个 bash 脚本来简化过程并运行这些命令 bin bash if 1 start then cd CCPP cd HelloWorld g Wall W We
  • 如何使用 Bash 编写二进制文件?

    我的问题是我需要创建一个包含以下确切字节的文件 48 00 49 00 我不能使用C perl 其他脚本语言 目标是嵌入式设备 我使用 awk 尝试过 在桌面上它确实有效 awk BEGIN printf c c c c 48 00 49
  • 检查 bash 中是否存在关联数组元素

    在 bash 脚本中 我在变量中有一个区域设置 如下所示 locale fr ma 我也有一个像这样的关联数组 declare A new loc map new loc fr ma en ma new loc el gr en gr ne
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上

随机推荐

  • PHP Sort 函数用于对对象数组进行排序

    我有一个充满同一类对象的数组 例如 我想通过可选对象字段对该数组进行排序 case gt ID or case gt Sender 是否有内置的 array sort 函数可以执行此操作 或者我必须自己编写此排序函数 答案不必详细解释 这更
  • 沉默的例外,

    我在 64 位中遇到过这个奇怪的静默异常问题 到底是什么原因导致这种行为呢 我想了解为什么会发生这种情况以及推荐的解决方案是什么 消失的 OnLoad 异常 http blog paulbetts org index php 2010 07
  • 如何处理 IncompleteRead: 在 python 中

    我正在尝试从网站获取一些数据 然而它返回了我incomplete read 我试图获取的数据是一组巨大的嵌套链接 我在网上做了一些研究 发现这可能是由于服务器错误 之前的分块传输编码完成 达到预期大小 我还找到了上述问题的解决方法link
  • Nifi:如何使 ListenHTTP 与 SSL 配合使用

    客观的 由于 Nifi 通过 HTTP 与其他工具集成 我必须ListenHTTP处理器面向公众 所有 3 个环境上的 API 网关对我来说太贵了 所以我关闭了所有虚拟机入口端口 除了ListenHTTP 对于外部网络 Issue 我的配置
  • 从终端打开 iPhone 应用程序

    是否可以从终端打开 iPhone 应用程序或 Xcode 项目 我已经尝试过 open path to project app 但这会返回警告并由于启动模拟器时出现图像加载错误而意外退出 有没有人有什么建议 您无法从终端启动 iPhone
  • 缓存图像的 CORS 策略

    在 chrome 22 和 safari 6 中 使用启用 CORS 的 S3 存储桶从 s3 加载图像以在画布中使用 以提取为主要目的 代码如下 img src http s3 bob jpg In the javascript exec
  • 重新访问变量 X 的无效类型(列表),其中 X 是日期类

    今天早些时候 我关注了以下主题并看到了答案 变量 X 的类型 列表 无效 其中 X 是日期类 https stackoverflow com questions 27606380 invalid type list for variable
  • Google Cloud dev_appserver.py 无法在本地托管 Laravel 项目

    我正在运行 Laravel 5 4 项目 并托管在 google cloud 项目下 为了测试相同的内容 我使用了dev appserver py app yaml runtime php55它启动程序但抛出显示的错误 Warning re
  • Parallel.ForEach 内存使用量持续增长

    public string SavePath get set I files public void DownloadList List
  • 如何将matlab中的绘图设置为特定大小?

    一般来说 我希望将相当复杂的 x y 图 大量重叠曲线 绘制为 A3 格式 因此 A4 210x297 A3 A4 2 420 x 297 10mm each side 400 x 277 size of desired plot wind
  • 如何更改 Google 地图标记上的图标

    我想在 Google 地图上使用我的自定义图标 并在代码中添加了图标 url 但它仍然没有反映在地图上 谁能建议一下 我在这里缺少什么 为什么添加图标 url 后图标没有改变 http google maps icons googlecod
  • 减速器中的 React-redux Spread 运算符返回错误“意外令牌”

    我遵循 Dan Abramov 的代码https github com tayiorbeii egghead io redux course notes blob master 08 Reducer Composition with Arr
  • 有什么理由只传递第一个元素而不是整个数组? [复制]

    这个问题在这里已经有答案了 好的 昨天我有一位同事来到我的办公室 问我一个关于他必须使用的 Fortran 代码的问题 基本上 他使用的代码有一个长的多维数组 以及一个需要这个长的多维数组作为参数的子例程 但是 调用该子例程的代码仅传递数组
  • CSS 中缩放渐变背景

    第一次提问 请对我宽容一些 我正在尝试为使用 JQuery Mobile 的网络应用程序制作背景渐变 我对 CSS 和 UI 设计一无所知 我希望渐变填充整个页面的空间 现在 它填充到原始窗口的大小 但向下滚动时会 切断 大多数建议都指向这
  • 如何在 Android Native Code 中使用 Keystore?

    我需要加密由用 C 编写的 android 本机服务创建的一些文件 我必须使用密钥库 但我不知道如何使用 有什么库或者文档吗 我知道该线程很旧 但也许它会对将来的某人有所帮助 以下提示参考 Android Keystore v3 和 v4
  • javascript/dashcode:检查互联网连接

    我正在开发一个通过ajax从互联网获取数据的小部件 如果该小部件无法连接到服务器 我想提供一条错误消息 我正在使用 jquery 的 ajax 对象执行请求 该对象提供了错误回调函数 但是当没有互联网连接时 仅当发出请求但因其他原因失败时才
  • AngularJS $http.post如何将json数据设置到请求正文中

    我正在尝试将带有 json 数据的 post 请求发送到服务器 但似乎 angularJS http post 方法没有将数据设置到正文中 我怎样才能让它将数据设置到正文中 远程服务器使用asp net webapi实现 将从body中读取
  • webpack 中的 module、chunk、bundle 分别是什么?

    我不太理解模块 块和捆绑等概念 entry foo webpack hot only dev server js src foo js bar src bar js output path dist filename name js 上述配
  • 插入忽略 - 有没有办法知道语句是否被忽略? MYSQL [重复]

    这个问题在这里已经有答案了 sql insert INSERT IGNORE if mysql query sql insert link or die Insertion Failed mysql error code to execut
  • Bash,eval 中的 CTRL+C 不会中断主脚本

    在我的 bash 脚本中 我正在运行存储在中的外部命令 cmd多变的 它可以是任何东西 甚至是一些简单的 bash oneliner If ctrl C is pressed while running the script I want