我有一个 bash 脚本,在其中执行 optional 命令可能会花费很长时间,具体取决于用户的输入。我想为用户提供结束命令的选项,并继续进行bash脚本中的下一个进程。
这是我当前的代码:(带有名为foocommand的命令)
for image in image_files:
img_data = np.nan_to_num(fits.getdata(image))
obj_num = int(re.search('2\d{6}', image).group(0))
count_num = int(re.search('_(\d+)_', image).group(1))
obj_index = int(np.where(good_data == obj_num)[0])
count_index = int(np.where(np.array(all_counters[obj_index]) == count_num)[0])
ra, dec = pos_match[obj_index][count_index]
w = WCS(image)
try:
x, y = w.all_world2pix(ra, dec, 0)
initial_data.append(img_data)
centroid_coords.append((float(x), float(y)))
except: # skip images where coordinates fail to converge
# Not sure how to identify the error here
continue
上面的代码有一个微调器,告诉用户命令正在运行。我想允许用户在微调器旋转时可以输入“ q”,以从完成退出命令“ foocommand”,执行一些清理代码,然后继续。
我认为可以将以上所有代码放入while命令中,如果用户曾经输入过字符并拥有if语句来执行清除操作,则可能会中断。但这只是一种可能的解决方案。
答案 0 :(得分:0)
也许这就是您想要的?设置TMOUT将使读取超时在秒数后结束,因此,如果用户输入“ q”然后按Enter,则下一次TMOUT ... read应该会得到它。
read -p "are you sure? [y/N]" -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]; then
sleep 60 &
pid=$!
trap "kill $pid 2> /dev/null" EXIT
while kill -0 $pid 2> /dev/null; do
for s in / - \\ \|; do
printf "\r$s";sleep .1
done
TMOUT=0 read ans || continue
[[ $ans == q ]] && exit
done
trap - EXIT
fi