gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:05:43 26 4
gpt4 key购买 nike

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

如果在运行脚本时按下 ctrl+C,我希望它终止当前正在运行的 $cmd 但它仍应继续运行主脚本。但是,我想保留在主脚本运行时使用 ctrl+C 终止主脚本的选项。

#!/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

现在,在“Ooook1?”时按 ctrl+C只有在读取完成后,读取才会中断评估。 (它会在“Oook2”之前中断)但是它会立即中断“ sleep 4”。

在这两种情况下,它都会做正确的事情 - 它只会中断 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)

关于Bash,评估中的 CTRL+C 不会中断主脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9196094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com