How to completely restart script from inside the script itself
I'm setting up a shell script with menues and sub menues, options, etc. But on each menu/submenu/etc, i need a "Go back to main menu" choice.
I've already got the menu set up and it works fine, but i need a way to simply restart the script from scratch, reset all variables etc etc.
Or a way to exit the current script and starting it again.
I've tried to do this:
ScriptLoc=$(readlink -f "$0")
./ScriptLoc
But that starts the "new" script inside the "old" script, so when i exit the "new" script, it goes back to the "old" script (if that makes any sense). It's a script inside a script kind of thing.
Anyone got an idea how to restart it completely?
Solution 1:
Yes, do
exec "$ScriptLoc"
The exec
bash builtin command replaces the current program with a new one.
Solution 2:
You can use something like this:
$(basename $0) && exit
$(basename $0)
will create a new instance of the current script and exit
will exit from the curent instance of the script.
Here is a test script that highlights the above method:
#!/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"
If you don't use export count=0
(which make count
to be an environment variable) and use only count=0
(which make cont
a local script variable), then the script will never stop.