Quando eu uso o exit
comando em um script de shell, o script finaliza o terminal (o prompt). Existe alguma maneira de finalizar um script e depois permanecer no terminal?
run.sh
É esperado que meu script seja executado diretamente, ou de outro script.
EDIT: Para ser mais específico, existem dois scripts run2.sh
como
...
. run.sh
echo "place A"
...
e run.sh
como
...
exit
...
quando eu passar por ele . run2.sh
, e se ele chegar exit
na linha de código run.sh
, quero que ele pare no terminal e fique lá. Mas exit
, usando , todo o terminal é fechado.
PS: Eu tentei usar return
, mas o echo
codeline ainda será executado ....
exit 0
para finalizar o script após o sucesso, quando executar o script ex:./test.sh
deverá ver a saída, mas o console permanecerá aberto.shell
comando, que abre de fato um terminal shell. Minha própria experiência, porém, é que isso não acontece comexit
. Sair normalmente devolve o controle ao script pai.Respostas:
O "problema" realmente é que você está adquirindo e não executando o script. Quando você origina um arquivo, seu conteúdo será executado no shell atual, em vez de gerar um subshell. Portanto, tudo, incluindo a saída, afetará o shell atual.
Em vez de usar
exit
, você desejará usarreturn
.fonte
runs.sh
@ruakh tem a melhor resposta para essa pergunta.sh <script>
oubash <script>
se alguém quiser executar um script e terminar em algum momentoSim; você pode usar em
return
vez deexit
. Seu principal objetivo é retornar de uma função shell, mas se você a usar em umsource
script -d, ela retornará desse script.Como §4.1 "Bourne Shell Builtins" do Manual de Referência do Bash coloca:
fonte
return
só pode ser usado a partir de uma função. Se você usarreturn
e executá-lo como um script shell (por exemplosh run.sh
), o bash irá relatar um erro -return: can only
retorno de uma função ou script` origemreturn
não funcionará se o script for executado como um shell script e não executado por. (ousource
) Aliás, onde posso encontrar o documentosource -d
?Em vez de executar o script usando
. run2.sh
, você pode executá-lo usandosh run2.sh
oubash run2.sh
Um novo sub-shell será iniciado e, para executar o script, será fechado no final do script, deixando o outro shell aberto.
fonte
sh "." run2.sh
?Você pode adicionar um comando de saída extra após a declaração / comando de retorno, para que funcione para ambos, executando o script na linha de comando e utilizando o terminal.
Exemplo de código de saída no script:
A linha com o
exit
comando não será chamada quando você originar o script após oreturn
comando.Quando você executa o script, o
return
comando apresenta um erro. Portanto, suprimimos a mensagem de erro encaminhando-a para/dev/null
.fonte
Na verdade, acho que você pode estar confuso com a forma como muda
run a script
.Se você
sh
costuma executar um script, digamos,sh ./run2.sh
mesmo que o script incorporado termine comexit
, sua janela de terminal ainda permanecerá.No entanto, se você usar
.
ousource
, sua janela do terminal também será encerrada / fechada quando o subscrito terminar.para mais detalhes, consulte Qual é a diferença entre usar
sh
esource
?fonte
É assim que você coloca uma função de execução dentro do script run2.sh. Você usa o código de saída dentro de run enquanto origina seu arquivo run2.sh no bash tty. Se a função fornecer a execução tiver o poder de sair do seu script e a run2.sh o poder de sair do terminador. Então, porque a função de execução tem poder para sair do seu teminador.
Enfim, eu aprovo com Kaz que é um problema de design.
fonte
Eu tive o mesmo problema e pelas respostas acima e pelo que entendi o que funcionou para mim, em última análise, foi:
Tenha uma linha shebang que chama o script pretendido, por exemplo,
#!/bin/bash
usabash
para executar o scriptEu tenho scripts com os dois tipos de shebang. Por causa disso, usar
sh
ou.
não é confiável, pois leva a uma execução incorreta (como quando o script falha por executar incompletamente)A resposta, portanto, foi
(chmod +x file.sh)
Invocá-lo diretamente, sem qualquer
sh
ou.
(./myscript.sh)
Espero que isso ajude alguém com uma pergunta ou problema semelhante.
fonte
Eu acho que isso acontece porque você está executando no modo de fonte com o ponto
Você deve executar isso em um subshell:
'source' http://ss64.com/bash/source.html
fonte
. myscript.sh
funcionar. No máximo, você pode precisar./myscript.sh
.É correto que os scripts originados x executados usem
return
vs.exit
para manter a mesma sessão aberta, como outros observaram.Aqui está uma dica relacionada, se você quiser um script que mantenha a sessão aberta, independentemente de sua origem ou não.
O exemplo a seguir pode ser executado diretamente como
foo.sh
ou originado como. foo.sh
/source foo.sh
. De qualquer forma, manterá a sessão aberta após "sair". A$@
cadeia é passada para que a função tenha acesso aos argumentos do script externo.Resultado terminal:
Isso pode ser útil para testar rapidamente as alterações de script em um único terminal, mantendo um monte de código de sucata embaixo do principal
exit
/return
enquanto você trabalha. Também poderia tornar o código mais portátil em certo sentido (se você tiver vários scripts que podem ou não ser chamados de maneiras diferentes), embora seja muito menos complicado usarreturn
eexit
quando apropriado.fonte
se o seu emulador de terminal não tiver,
-hold
você pode limpar um script de origem e manter o terminal pressionado com:caso contrário, você pode usar
$TERM -hold -e script
fonte
Certifique-se também de retornar com o valor esperado. Caso contrário, se você usar exit quando encontrar uma saída, ela sairá do shell base, pois a origem não cria outro processo (instância).
fonte
Para escrever um script que é seguro para ser executado como um script shell ou de origem como um arquivo rc, o script pode verificar e comparar
$0
e$BASH_SOURCE
e determinar seexit
pode ser usado com segurança.Aqui está um trecho de código curto para esse
fonte
1) a saída 0 sairá do script se for bem-sucedida.
2) a saída 1 sairá do script se houver falha.
Você pode tentar estes acima de dois com base no seu req.
fonte