Tôi đang tìm nguồn cung cấp một tập lệnh bash trong thiết bị đầu cuối , do đó không có lỗi với
set -o errexit
Giết thiết bị đầu cuối của tôi, đó là TUYỆT VỜI, bởi vì tôi phải đóng thiết bị đầu cuối, mở một thiết bị khác và đặt lại một số biến.
Cho đến nay, sử dụng
command || return
trong các kịch bản, đang thực hiện chính xác những gì tôi muốn
set -o errexit
để làm ... Nhưng tôi muốn nó được thực hiện cho toàn bộ kịch bản; không chỉ một dòng / lệnh
Tôi có một tệp chứa đầy đủ các lệnh để thiết lập trang web và tôi không muốn thực hiện lệnh | | trở về
cho mỗi dòng trong tệp
Có một tùy chọn thiết lập khác, hoặc một cái gì đó khác sẽ chỉ "trở lại" thay vì thoát khỏi thiết bị đầu cuối?
- Để rõ ràng , tôi muốn giết tập lệnh và để thiết bị đầu cuối ở trạng thái tương tự nhấn ctrl + C để giết dịch vụ đang chạy trong thiết bị đầu cuối. command || return
làm điều đó Nhưng tôi không muốn giải || return
quyết từng dòng trong tệp. Vì vậy, tôi đang tìm kiếm một cái gì đó tương tự set -o errexit
, điều đó không làm cho thiết bị đầu cuối bị tắt
--- Lưu ý: Tạo tập lệnh câm có hai dòng trong đó (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
Và đặt set -o errexit
ở đầu của created.sh,
hoạt động chính xác như tôi mong đợi Tuy nhiên, thật ngu ngốc khi phải tạo một tệp có hai dòng trong đó, chỉ để gọi một tập lệnh bash khác, thay vì chỉ gọi nó từ thiết bị đầu cuối. Ái chà
Dưới đây là một số ví dụ:
trong super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
trong tạo.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
trong thiết bị đầu cuối:
$ bash super.sh
sản lượng như mong đợi:
my-mac$
Những công việc này. Thật là một giải pháp khó chịu.
Tôi muốn , lý tưởng nhất là thực thi những gì trong tệp super.sh ngu ngốc từ thiết bị đầu cuối, chứ không phải tệp super.sh: D, mà không cần thiết bị đầu cuối tắt với tôi. Đây là những gì xảy ra với những gì tôi đang cố gắng làm:
lệnh đầu cuối:
my-mac$ source $create_path blah
trong create.sh tôi vẫn có set -o errexit
Đây là đầu ra trên thiết bị đầu cuối
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
Và sau đó thiết bị đầu cuối bị đóng băng. Ctrl + C không hoạt động, Ctrl + D cũng không
Nếu thay vì set -o errexit
, nếu tôi chỉ sử dụng các command || return
câu lệnh ở mọi nơi trong tệp create.sh, thì tôi sẽ nhận được chính xác những gì tôi muốn, trong khi thực hiện các dòng trong supser.sh trực tiếp trên thiết bị đầu cuối (thay vì gọi super.sh từ thiết bị đầu cuối). Nhưng đó cũng không phải là một giải pháp thực tế.
Lưu ý: Tôi thích câu trả lời của @terdon về việc sinh ra một vỏ con nên cuối cùng tôi chỉ sinh ra một vỏ con thông qua tập lệnh thay vì thiết bị đầu cuối, như anh ấy đã thể hiện trong câu trả lời của mình bằng cách sử dụng dấu ngoặc nhọn ( )
, xung quanh toàn bộ tập lệnh .. làm việc quá
source $file_path argument
Kịch bản đang được thực thi trong cùng một shell mà tôi đã gọi nó từ (cái gì source
, tôi đã được thông báo ... và hành động như trường hợp đó) command || return
nằm trong tệp tôi đang thực thi trong thiết bị đầu cuối