Bash 使用killall命令退出脚本是否合乎逻辑?

Bash 使用killall命令退出脚本是否合乎逻辑?,bash,Bash,我正在使用一个引脚生成器,我遇到了一个小问题。 我知道退出脚本的几种不同方法,但是我一直在尝试调用作为子进程运行的同一个脚本,但是当没有调用子进程时,脚本会完全退出。调用时,在子脚本完成并退出后,父脚本不会正确退出,并且父脚本会循环回用户输入。除了可能使用“wait”命令之外,我想不出任何其他方法,尽管我不知道这个命令是否适合此代码。使用“killall”命令退出脚本有什么想法吗?我已经对它进行了测试,正如您在下面的代码中看到的,但是我留下了消息“Terminated”,如果我可以使用killa

我正在使用一个引脚生成器,我遇到了一个小问题。 我知道退出脚本的几种不同方法,但是我一直在尝试调用作为子进程运行的同一个脚本,但是当没有调用子进程时,脚本会完全退出。调用时,在子脚本完成并退出后,父脚本不会正确退出,并且父脚本会循环回用户输入。除了可能使用“wait”命令之外,我想不出任何其他方法,尽管我不知道这个命令是否适合此代码。使用“killall”命令退出脚本有什么想法吗?我已经对它进行了测试,正如您在下面的代码中看到的,但是我留下了消息“Terminated”,如果我可以使用killall,我将如何防止该消息打印到标准输出?这是我的密码:

    #!/bin/bash

    clear
    echo ""
    echo "Now generating a random pin."
    sleep 3
    echo ""
    echo "----------------------------------------------"
    echo ""


    # Generates a random 8-digit number
    gen_num=$(tr -dc '0-9' </dev/urandom |  head -c 8)


    echo " Pin = $gen_num "
    echo ""
    echo "Pin has been generated!"
    sleep 3
    echo ""
    clear

    PS3="Would you like to generate another pin?: "
    select CHOICE in "YES" "NO"
    do

    if [ "$CHOICE" == "YES" ]
    then

    bash "/home/yokai/Modules/Wps-options.sh"

    elif [ "$CHOICE" == "NO" ]
    then

    clear
    echo ""
    echo "Okay bye!"
    sleep 3
    clear
    killall "Wps-options.sh"
    break
    exit 0

    fi
    done
    exit 0
#/bin/bash
清楚的
回声“”
echo“正在生成一个随机pin。”
睡眠3
回声“”
回声“----------------------------------------------------”
回声“”
#生成一个随机的8位数字

gen_num=$(tr-dc'0-9'首先,当您执行

bash "/home/yokai/Modules/Wps-options.sh"
脚本分叉并装箱子进程,然后等待子进程终止,并且不会继续执行,除非脚本Wps options.sh在后台执行其他内容(再次分叉)没有收获它的孩子。但我不能告诉你更多,因为我不知道你的脚本中有什么Wps选项。sh

要防止在执行killall时将消息打印到stdout,请执行以下操作:

 killall "Wps-options.sh" 1> /dev/null 2> /dev/null

1>表示标准输出重定向到文件/dev/null2>表示标准输出重定向到文件/dev/null

,您不需要递归调用同一个脚本(然后杀死它的所有实例)。以下脚本在不分叉的情况下执行任务:

#!/bin/bash
gen_pin () {
  echo 'Now generating a random pin.'
  # Generates a random 8-digit number
  gen_num="$(tr -dc '0-9' </dev/urandom | head -c 8)"
  echo "Pin = ${gen_num}"
  PS3='Would you like to generate another pin?:'
  select CHOICE in 'NO' 'YES'
  do 
    case ${CHOICE} in 
      'NO')
        echo 'OK'
        exit 0;;
      *) 
        break;;
    esac
  done
}  
while true
do
  gen_pin
done
!/bin/bash
gen_引脚(){
echo“正在生成一个随机pin。”
#生成一个随机的8位数字

根数=”$(tr-dc'0-9'让我困惑的是,尽管语法是功能性的,但在子进程结束并退出后,父进程也打算结束并退出,但它将循环回用户输入。到目前为止,这是整个脚本。我将它用作一个简单的可选脚本,从另一个进程调用,但我没有其他cal我还没有完成这个特定的脚本。所以我在这里发布的代码是到目前为止的完整代码。感谢您提供的stdout信息。孩子唯一应该分叉自己孩子的方法是如果“是”选项在子进程内运行,但我尚未执行此操作。脚本Wps-options.sh也是我发布的代码。它正在作为子进程运行自身的第二个实例。如果要再次执行同一脚本,但不创建子进程,请使用
exec“$0”
--这假设您的脚本是可执行的,并且可以在$PATH.Ref 100%解决方案中找到。非常感谢您,先生。这将以非常有效的方式降低资源成本。恭喜您。很高兴听到它对您有效!请记住,select控件结构也是一个循环!循环将一直持续到中断(CTRL+C)遇到,因此不需要while循环