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 (apasource
, saya telah diberitahu ... dan bertindak seperti itu)command || return
pernyataan dalam file yang sayaJawaban:
Cukup sumber file dengan failafe:
... maka perintah keseluruhan tidak akan gagal, bahkan jika
source
tidak.sumber
source file || true
tidak melakukan ini, juga tidaksource file || return
ketika saya mengetik ini ke terminal ...Jills-MBP:~ jillr$ source ~/Desktop/site_builder/create.sh blah || true
Ini hanya mengeksekusi bagian selanjutnya dari skrip pada gagal, jadi kembali bukan benar. Satu-satunya hal yang berhasil adalahcommand || return
pernyataan dalam file aktual untuk semua perintah, yang konyol. Saya tidak tahu apakah melempar semuanya ke dalam fungsi kemudian memanggilfunction || return
di akhir file akan ada gunanya juga.|| return
perintah yang gagal, ya, itu akan kembali. Saya pikir kami berusaha menjaga agar shell induk / induk Anda tidak keluar?Ini adalah satu-satunya hal yang berfungsi untuk apa yang saya perlu capai (menciptakan lingkungan virtual kemudian mengaktifkannya, kemudian menginstal persyaratan dari skrip bash):
menelurkan shell subkulit / anak dari skrip, seperti pada:
stupid_file.sh
jalankan stupid_file menggunakan:
TAMAT.
** Membungkuk **
(kredit jatuh ke Jeff dan Terdon)
sumber
bash $create_path blah
dan melihat apakah masih keluar, dan mengeksekusi dengan cara yang sama, dan masih menginstal barang ke lingkungan virtual saya dengan benar. Kehabisan waktu sekarang.(...)
, karena semua tugas dalam tanda kurung hanya mempengaruhi subkulit itu.foo=3; (foo=5); echo "$foo"
akan menampilkan 3, bukan 5.source file
dari terminal dan mengharapkan hasil yang sama. Karena itu tidak pernah berhasil. Satu-satunya waktu saya mendapatkan hasil yang sama adalah ketika saya membuat sub shell secara eksplisit, apakah melalui terminal, atau dari skrip. Namun saya dapat menggunakanbash
alih-alihsource
untuk mengeksekusi skrip, dan mendapatkan hasil yang sama, tetapi hanya ketika saya mengeksekusi skrip saya di sub shell secara eksplisitpip install -r $apath/requirements.txt
dalam lingkungan yang diaktifkan itu. Itu sebabnya saya menggunakan sumber untuk memanggil scriptSebagai solusi sederhana, Anda dapat menjalankan shell di shell Anda saat ini dan sumber di sana. Sesuatu seperti:
Buka terminal baru dan atur semuanya sesuai keinginan Anda. Anda menyebutkan beberapa variabel lingkungan dan sejenisnya. Atur mereka di sini.
Di terminal itu, mulai shell baru. Misalnya
bash
,.Lakukan pekerjaanmu. Sumber skrip Anda. Jika keluar, Anda baru saja dilemparkan ke dalam shell pertama dan semuanya masih diatur. Jalankan
bash
kembali dan Anda kembali dalam bisnis.Sebagai ilustrasi, saya membuat skrip ini yang akan gagal jika Anda mencoba untuk sumbernya:
Mari kita lihat apa yang terjadi jika saya memulai sesi shell bersarang dan kemudian sumber itu (catatan bahwa saya menggunakan nama portabel untuk
source
perintah,.
;source
adalah bashism a):Seperti yang Anda lihat, kesalahan sintaksis menyebabkan skrip bersumber untuk keluar yang, pada gilirannya menyebabkan sesi shell saya keluar tetapi karena itu adalah sesi bersarang, yang baru saja membuat saya kembali ke aslinya, shell induk dengan semua variabel masih mengatur . Sekarang, jalankan lagi shell baru dan Anda dapat kembali ke sumber skrip Anda.
sumber
create_path=~/Desktop/site_builder/create.sh
di shell orangtua karena saya sering melakukannya. Dan saya membutuhkannya untuk memanggil sumber $ create_path [argumen] untuk mengeksekusi skrip.export
. Tetapi apa yang Anda gambarkan benar-benar sangat tidak masuk akal. Ini terdengar lebih dan lebih seperti masalah XY . Anda mungkin ingin memposting pertanyaan baru yang menjelaskan apa tujuan akhir Anda. Saya yakin kami bisa memberikan Anda solusi yang lebih baik dari semua sumber aneh ini.