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 que source
faz, me disseram ... e age como esse) as command || return
instruções estão no arquivo que estou executando no terminal