如何从脚本内部完全重新启动脚本

如何从脚本内部完全重新启动脚本

我正在设置一个带有菜单、子菜单、选项等的 shell 脚本。但在每个菜单/子菜单/等等上,我都需要一个“返回主菜单”选项。

我已经设置了菜单并且它运行良好,但我需要一种方法来简单地从头开始重新启动脚本,重置所有变量等等。

或者退出当前脚本并重新启动它的方法。

我曾尝试这样做:

ScriptLoc=$(readlink -f "$0")
./ScriptLoc

但是这会在“旧”脚本中启动“新”脚本,因此当我退出“新”脚本时,它会返回到“旧”脚本(如果这有任何意义的话)。这是一种脚本中的脚本。

有人知道如何彻底重启它吗?

答案1

是的

exec "$ScriptLoc"

execbash 内置命令用新程序替换当前程序。

答案2

您可以使用类似这样的方法:

$(basename $0) && exit

$(basename $0)将创建当前脚本的新实例并exit退出该脚本的当前实例。

下面是重点介绍上述方法的测试脚本:

#!/bin/bash

if ! [[ $count =~ ^[0-9]+$ ]] ; then
    export count=0
fi

echo $count

if [ $count -le 10 ]; then
    count=$(echo "$count+1" | bc)   
    ./$(basename $0) && exit #this will run if started from the same folder
fi

echo "This will be printed only when the tenth instance of script is reached"

如果您不使用export count=0(将其count作为环境变量)而仅使用count=0(将其作为cont本地脚本变量),那么脚本将永远不会停止。

答案3

可靠地获取当前正在执行的脚本比你想象的要难。请参阅http://mywiki.wooledge.org/BashFAQ/028

相反,你可以做这样的事情:

main_menu() { 
    printf '1. Do something cool\n'
    printf '2. Do something awesome\n'
    : ... etc
}

some_sub_sub_menu() {
    ...
    printf 'X. Return to main menu\n'
    ...
    if [[ $choice = [Xx] ]]; then
        exit 255
    fi
}

while true; do
    (main_menu)
    res=$?
    if (( res != 255 )); then
        break
    fi
done

基本上,您在子 shell 中运行 main_menu 函数,因此如果您从 main_menu 或任何子菜单退出,则退出的是子 shell,而不是主 shell。此处选择退出状态 255 表示“再次执行”。任何其他退出状态都将跳出无限循环。

答案4

晚了,新手,但我必须使用绝对路径才能使我的工作:

exec "/usr/local/bin/audio-device-switch.sh"

(exec "$ScriptLoc" 对我来说不起作用)

相关内容