Saya sumber skrip bash di terminal , jadi keluar dari kesalahan dengan
set -o errexit
membunuh terminal saya, yang sangat LUAR BIASA, karena saya harus menutup terminal, buka yang lain, dan reset beberapa variabel.
Sejauh ini, menggunakan
command || return
baris, dalam skrip, melakukan apa yang saya inginkan
set -o errexit
untuk melakukan ... Tapi saya ingin itu dilakukan untuk seluruh skrip; bukan hanya satu baris / perintah
Saya memiliki file yang penuh dengan perintah untuk mengatur situs, dan saya lebih suka tidak melakukan perintah || kembali
untuk setiap baris dalam file
Apakah ada opsi set lain, atau sesuatu yang hanya akan "kembali" alih-alih keluar dari terminal?
- Hanya untuk kejelasan , saya ingin membunuh skrip, dan meninggalkan terminal dalam keadaan yang sama yang menekan ctrl + C untuk membunuh layanan yang berjalan di terminal. command || return
apakah itu. Tapi saya tidak ingin menempel || return
ke setiap baris dalam file. Jadi saya mencari sesuatu yang mirip set -o errexit
, yang tidak menyebabkan terminal mati
--- Catatan: Membuat skrip bodoh dengan dua baris di dalamnya (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
Dan menempatkan set -o errexit
di bagian atas create.sh,
bekerja persis seperti yang saya harapkan. Namun, itu benar-benar bodoh harus membuat file dengan dua baris di dalamnya, hanya untuk memanggil skrip bash, bukan hanya memanggilnya dari terminal. Ugghhh
inilah beberapa contoh:
di super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
di 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
di terminal:
$ bash super.sh
output seperti yang diharapkan:
my-mac$
Ini bekerja. Solusi yang menjengkelkan.
Idealnya, saya ingin mengeksekusi apa yang ada di file super.sh bodoh dari terminal, bukan file super.sh: D, tanpa terminal mematikan saya. Inilah yang terjadi dengan apa yang saya coba lakukan:
perintah terminal:
my-mac$ source $create_path blah
di create.sh saya masih punya set -o errexit
Inilah output pada 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]
Dan kemudian terminal dibekukan. Ctrl + C tidak berfungsi, begitu juga Ctrl + D
Jika alih-alih set -o errexit
, jika saya hanya menggunakan command || return
pernyataan di mana-mana di file create.sh, maka saya mendapatkan apa yang saya inginkan, sambil mengeksekusi baris di supser.sh langsung di terminal (alih-alih memanggil super.sh dari terminal). Tapi itu juga bukan solusi yang praktis.
Catatan: Saya menyukai jawaban @terdon tentang hanya menelurkan shell anak jadi saya akhirnya hanya menelurkan sub shell melalui skrip alih-alih terminal, karena ia menunjukkan dalam jawabannya menggunakan kawat gigi ( )
, di sekitar seluruh skrip .. Jawabannya bekerja juga.
source $file_path argument
Skrip dieksekusi dalam shell yang sama dengan yang saya sebut dari (apa source
, saya telah diberitahu ... dan bertindak seperti itu) command || return
pernyataan dalam file yang saya