如何让用户退出bash中特定命令的过程

时间:2018-08-24 00:55:02

标签: bash

我有一个 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语句来执行清除操作,则可能会中断。但这只是一种可能的解决方案。

1 个答案:

答案 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