sourcing d'un script Bash – Retour sur Erreur, au lieu de Quitter?

Je cherche un script bash dans le terminal , donc en sortant en erreur avec

set -o errexit 

tue mon terminal, ce qui est extrêmement ennuyeux, parce que je dois fermer le terminal, en ouvrir un autre, et réinitialiser certaines variables.

Jusqu'à présent, l'utilisation

 command || return 

lignes, dans le script, fait exactement ce que je veux

 set -o errexit 

à faire … Mais je le veux fait pour l'set du scénario; pas seulement une ligne / command

J'ai un file plein de commands pour configurer un site, et je préfère ne pas faire de command || revenir

pour chaque ligne du file

Y a-t-il une autre option de jeu, ou quelque chose d'autre qui va simplement "returnner" au lieu de quitter le terminal?

Juste pour plus de clarté , j'aimerais tuer le script, et laisser le terminal dans le même état que le fait d'appuyer sur ctrl + C pour tuer un service exécuté dans le terminal. command || return command || return fait ça. Mais je ne veux pas virer || return || return à chaque ligne du file. Je cherche donc quelque chose de similaire à set -o errexit , qui ne provoque pas la fermeture du terminal

— Note: Créer un script stupide avec deux lignes (super.sh):

 create_path=~/Desktop/site_builder/create.sh source $create_path blah 

Et en plaçant set -o errexit en haut de create.sh,

fonctionne exactement comme je l'espère. Cependant, il est vraiment stupide d'avoir à créer un file avec deux lignes, juste pour appeler un autre script bash, au lieu de simplement l'appeler depuis le terminal. Ugghhh

voici quelques exemples:

dans super.sh

 #!/bin/bash create_path=~/Desktop/site_builder/create.sh source $create_path blah 

dans 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 

dans le terminal:

  $ bash super.sh 

sortie comme prévu:

 my-mac$ 

Cela marche. Quelle solution ennuyeuse.

Je veux , idéalement, exécuter ce qui est dans le stupide file super.sh du terminal, pas le file super.sh: D, sans que le terminal ne s'arrête sur moi. C'est ce qui se passe avec ce que j'essaie de faire:

command du terminal:

 Jills-MBP:~ jillr$ source $create_path blah 

dans create.sh j'ai toujours set -o errexit

Voici la sortie sur le 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] 

Et puis le terminal est gelé. Ctrl + C ne fonctionne pas, ni Ctrl + D

Si au lieu de set -o errexit , si j'utilise juste la command || return command || return déclarations partout dans le file create.sh, alors j'obtiens exactement ce que je veux, lors de l'exécution des lignes dans supser.sh directement sur le terminal (au lieu d'appeler super.sh depuis le terminal). Mais ce n'est pas non plus une solution pratique.

Note: J'ai aimé la réponse de @terdon à propos de la génération d'un shell enfant, donc j'ai fini par créer un sous-shell via le script au lieu du terminal, comme il l'a montré dans sa réponse en utilisant les accolades ( ) , tout autour du script. Sa réponse fonctionne aussi.

Comme solution de contournement simple, vous pouvez exécuter un shell dans votre shell actuel et la source là-bas. Quelque chose comme:

  1. Ouvrez un nouveau terminal et réglez le tout comme vous le souhaitez. Vous avez mentionné certaines variables d'environnement et autres. Configurez-les ici.

  2. Dans ce terminal, démarrez un nouveau shell. Par exemple, bash .

  3. Faire votre truc. Source votre script. S'il sort, vous êtes simplement jeté dans la première coquille et tout est encore en place. Il suffit de lancer bash et vous êtes de return dans les affaires.

Pour illustrer, j'ai créé ce script qui échouera si vous essayez de le find:

 $ cat /home/terdon/scripts/bar.sh set -o errexit var='bar' 

Voyons ce qui se passe si je démarre une session shell nestede et que je la trouve ensuite (notez que j'utilise le nom portable pour la command source , la source est un bashisme):

 parent-shell $ bash ## start a new shell child-shell $ . ~/scripts/bar.sh bash: /home/terdon/scripts/bar.sh: line 2: unexpected EOF while looking for matching `'' parent-shell $ 

Comme vous pouvez le constater, l'erreur de syntaxe a provoqué la sortie du script source qui a provoqué la sortie de ma session shell, mais comme il s'agissait d'une session nestede, elle vient de me renvoyer au shell parent d'origine avec toutes les variables encore configurées . Maintenant, lancez un nouveau shell et vous pouvez revenir à l'origine de votre script.

Il suffit de searchr le file avec une security embeddede:

 source the-source-file || true 

… alors la command globale n'échouera pas, même si la source fait.

Donc, j'ai fini par utiliser la solution de terdon, sauf que je viens de reproduire le shell sous-shell / enfant du script, comme dans:

create.sh

 ( set -o errexit #bunch of commands #one line fails ) 

Cela me permet de ne pas coller || return || return partout et me permet d'appeler create.sh depuis le terminal, sans que le terminal lui-même ne sorte