Estou configurando um script de shell com menus e submenus, opções etc. Mas em cada menu / submenu / etc, preciso da opção "Voltar ao menu principal".
Eu já tenho o menu configurado e funciona bem, mas preciso de uma maneira de simplesmente reiniciar o script do zero, redefinir todas as variáveis, etc.
Ou uma maneira de sair do script atual e iniciá-lo novamente.
Eu tentei fazer isso:
ScriptLoc=$(readlink -f "$0")
./ScriptLoc
Mas isso inicia o script "novo" dentro do script "antigo", portanto, quando eu saio do script "novo", ele volta ao script "antigo" (se isso faz algum sentido). É um script dentro de um tipo de coisa de script.
Alguém tem uma idéia de como reiniciá-lo completamente?
command-line
scripts
restart
Moonbloom
fonte
fonte
$ScriptLoc
qualquer forma, isso deve ser :./ScriptLoc
procura um script com esse nome no diretório atual.Respostas:
Sim faça
O
exec
comando bash builtin substitui o programa atual por um novo.fonte
Você pode usar algo como isto:
$(basename $0)
criará uma nova instância do script atual eexit
sairá da instância atual do script.Aqui está um script de teste que destaca o método acima:
Se você não usar
export count=0
(o que tornacount
uma variável de ambiente) e usar apenascount=0
(que tornacont
um script local variável), o script nunca será interrompido.fonte
&& exit
sairá somente se o script for bem-sucedido. Portanto, se, por exemplo, o script não for executável ou apresentar um erro de sintaxe, é provável que ele gire.Obter o script que está sendo executado de maneira confiável é mais difícil do que você imagina. Veja http://mywiki.wooledge.org/BashFAQ/028 .
Em vez disso, você poderia fazer algo assim:
Basicamente, você executa a função main_menu em um subshell; portanto, se você sair do main_menu ou de qualquer um dos submenus, sai do subshell, não do shell principal. o status de saída 255 é escolhido aqui para significar "ir novamente". Qualquer outro status de saída sairá do loop infinito.
fonte