Estou adquirindo um script bash no terminal , então, saindo por erro com
set -o errexit
mata meu terminal, o que é extremamente irritante, porque tenho que fechar o terminal, abrir outro e redefinir algumas variáveis.
Até agora, usando
command || return
linhas, no script, está fazendo exatamente o que eu quero
set -o errexit
fazer ... Mas eu quero que seja feito para todo o script; não apenas uma linha / comando
Eu tenho um arquivo cheio de comandos para configurar um site e prefiro não executar o comando || Retorna
para cada linha do arquivo
Existe outra opção definida, ou outra coisa que apenas "retornará" em vez de sair do terminal?
- Para maior clareza , eu gostaria de matar o script e deixar o terminal no mesmo estado que pressionar ctrl + C para matar um serviço em execução no terminal. command || return
faz isso. Mas não quero aderir || return
a todas as linhas do arquivo. Então, estou procurando algo semelhante set -o errexit
, que não faça com que o terminal seja desligado
--- Nota: Criando um script burro com duas linhas (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
E colocando set -o errexit
no topo do create.sh,
funciona exatamente como eu esperava. No entanto, é realmente estúpido ter que criar um arquivo com duas linhas, apenas para chamar outro script bash, em vez de apenas chamá-lo do terminal. Ugghhh
Aqui estão alguns exemplos:
em super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
no create.sh
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
no terminal:
$ bash super.sh
saída conforme o esperado:
my-mac$
Isso funciona. Que solução irritante.
Eu quero , de preferência, para executar o que está no arquivo super.sh estúpido do terminal, não o arquivo super.sh: D, sem ter o fechamento do terminal para baixo em mim. É o que acontece com o que estou tentando fazer:
comando terminal:
my-mac$ source $create_path blah
no create.sh eu ainda tenho set -o errexit
Aqui está a saída no terminal
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
E então o terminal é congelado. Ctrl + C não funciona, nem Ctrl + D
Se, em vez de set -o errexit
, se eu apenas usar command || return
instruções em qualquer lugar do arquivo create.sh, obtenho exatamente o que quero, enquanto executo as linhas no supser.sh diretamente no terminal (em vez de chamar super.sh do terminal). Mas essa também não é uma solução prática.
Nota: Gostei da resposta de @terdon sobre gerar um shell filho, então acabei gerando um sub shell por meio do script em vez do terminal, como ele mostrou em sua resposta usando o aparelho ( )
, em todo o script .. Sua resposta funciona também
source $file_path argument
O script está sendo executado no mesmo shell que eu chamei de (o quesource
faz, me disseram ... e age como esse) ascommand || return
instruções estão no arquivo que estou executando no terminalRespostas:
Simplesmente origine o arquivo com segurança:
... então o comando geral não falhará, mesmo que
source
isso aconteça.fonte
source file || true
não faz isso, também nãosource file || return
quando eu digito esta no terminal ...Jills-MBP:~ jillr$ source ~/Desktop/site_builder/create.sh blah || true
ele simplesmente executa a próxima parte do script em falha, assim como retorna em vez de verdadeiro. A única coisa que funcionou são ascommand || return
instruções no arquivo real para todos os comandos, o que é bobo. Eu não sei se jogar tudo em uma função, em seguida, chamarfunction || return
no final do arquivo seria bom também.|| return
um comando que falhar, o sim retornará. Eu pensei que estávamos tentando impedir que seu shell principal / principal saísse?Essa é a única coisa que funciona para o que eu precisava realizar (criar um ambiente virtual, ativá-lo e instalar requisitos a partir de um script bash):
gera um shell subshell / filho do script, como em:
stupid_file.sh
execute o stupid_file usando:
O FIM.
** faz uma reverência **
(o crédito é para Jeff e Terdon)
fonte
bash $create_path blah
ver se ele ainda existe, e é executado da mesma maneira, e ainda instala coisas no meu ambiente virtual corretamente. Fora de tempo agora.(...)
, pois todas as atribuições entre parênteses afetam apenas esse subshell.foo=3; (foo=5); echo "$foo"
saída de vontade 3, não 5.source file
do terminal e esperar os mesmos resultados. Porque isso nunca funcionou. A única vez que obtenho os mesmos resultados é quando crio um sub shell explicitamente, seja pelo terminal ou pelo script. No entanto eu posso usarbash
em vez desource
executar o script, e obter os mesmos resultados, mas só quando eu executar o meu script em um sub shell explicitamentepip install -r $apath/requirements.txt
dentro desse ambiente ativado. É por isso que usei o source em primeiro lugar para chamar o scriptComo uma solução alternativa simples, você pode executar um shell no seu shell atual e fonte lá. Algo como:
Abra um novo terminal e configure tudo da maneira que desejar. Você mencionou algumas variáveis de ambiente e similares. Coloque-os aqui.
Nesse terminal, inicie um novo shell. Por exemplo
bash
,.Faça a sua coisa. Crie seu script. Se sair, você é jogado no primeiro shell e tudo ainda está configurado. Apenas corra
bash
novamente e você estará de volta aos negócios.Para ilustrar, eu criei este script que falhará se você tentar fonte:
Vamos ver o que acontece se eu iniciar uma sessão de shell aninhado e, em seguida, fonte ele (note que eu estou usando o nome portátil para o
source
comando.
;source
é um Bashismo):Como você pode ver, o erro de sintaxe fez com que o script de origem fosse encerrado, o que, por sua vez, causou a saída da minha sessão do shell, mas como era uma sessão aninhada, acabou de me levar de volta ao shell pai original com todas as variáveis ainda configuradas . Agora, basta executar um novo shell novamente e você pode voltar ao fornecimento do seu script.
fonte
create_path=~/Desktop/site_builder/create.sh
o shell pai porque faço isso com frequência. E eu preciso chamar source $ create_path [argument] para executar o script.export
as estará usando . Mas o que você descreve realmente faz muito pouco sentido. Parece cada vez mais um problema XY . Você pode postar uma nova pergunta explicando qual é seu objetivo final. Aposto que podemos lhe dar uma solução melhor que toda essa fonte estranha.