Je recherche un script bash dans le terminal , donc je quitte en cas d'erreur avec
set -o errexit
tue mon terminal, ce qui est extrêmement ennuyeux, car je dois fermer le terminal, en ouvrir un autre et réinitialiser certaines variables.
Jusqu'à présent, en utilisant
command || return
lignes, dans le script, fait exactement ce que je veux
set -o errexit
à faire ... Mais je veux que ce soit fait pour tout le script; pas seulement une ligne / commande
J'ai un fichier plein de commandes pour configurer un site, et je préfère ne pas faire de commande || revenir
pour chaque ligne du fichier
Y a-t-il une autre option définie, ou autre chose qui "reviendra" au lieu de quitter le terminal?
- Pour plus de clarté , je voudrais 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
est-ce que. Mais je ne veux pas m'attacher || return
à chaque ligne du fichier. Je cherche donc quelque chose de similaire set -o errexit
qui ne provoque pas l'arrêt du terminal
--- Remarque: Création d'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'attends. Cependant, c'est vraiment stupide de devoir créer un fichier 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 souhaite , idéalement, exécuter ce qui se trouve dans le stupide fichier super.sh à partir du terminal, pas le fichier super.sh: D, sans que le terminal ne soit arrêté sur moi. Voici ce qui se passe avec ce que j'essaie de faire:
commande de terminal:
my-mac$ source $create_path blah
dans create.sh j'ai encore 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, pas plus que Ctrl + D
Si au lieu de set -o errexit
, si j'utilise simplement des command || return
instructions partout dans le fichier create.sh, alors j'obtiens exactement ce que je veux, tout en exécutant les 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.
Remarque: J'ai aimé la réponse de @terdon à propos de la création d'un shell enfant, donc j'ai fini par générer un sous-shell via le script au lieu du terminal, comme il l'a montré dans sa réponse en utilisant les accolades ( )
, autour du script entier. Sa réponse fonctionne aussi.
source $file_path argument
Le script est exécuté dans le même shell que je l'ai appelé (qu'est source
- ce qui m'a été dit ... et agit comme c'est le cas) les command || return
instructions sont dans le fichier que