Câu hỏi Làm thế nào để ngăn chặn "nguồn" trong một kịch bản bash từ đi qua các đối số của kịch bản?


Những câu hỏi này giải quyết các chức năng của source: Sự khác biệt giữa việc thực hiện một kịch bản Bash so với tìm nguồn cung ứng nó là gì? 'Nguồn' làm gì?

nhưng tôi bối rối là tại sao lại gọi source trong một kịch bản chuyển các đối số của tập lệnh. Ví dụ. Tôi có 2 tập lệnh sau:

caller.sh

source sourced.sh
source sourced.sh ""

sourced.sh

echo [$*]

Khi tôi làm

./caller.sh arg1 arg2

tôi có

[arg1 arg2]
[]

"arg1 arg2" được chuyển đến sourced.sh mặc dù tôi đã không chỉ định source sourced.sh $*.

Tại sao?

Tôi thấy rằng phụ thêm "" ngăn không cho các đối số được truyền đi. Đây có phải là cách được đề xuất để ngăn chặn các đối số được truyền không?


2
2018-01-21 12:13


gốc


".. Khả năng mã nguồn một kịch bản với các đối số là một bashism .."  Kiểm tra tại đây để biết thêm chi tiết. - Hastur


Các câu trả lời:


source cho phép bạn thực hiện một lệnh trong Ngữ cảnh hiện tại (lập luận $* là một phần của bối cảnh).

Thư hai source cuộc gọi sẽ ghi đè các đối số này. Lưu ý rằng nó sẽ ghi đè chúng chỉ cho cuộc gọi, chúng được khôi phục ngay sau đó.


4
2018-01-21 12:43



Cảm ơn, Amessihel. Liệu cuộc gọi thứ hai có phải là cách được đề nghị để bỏ qua các đối số không? - Gnubie
Nếu bạn muốn thực hiện lệnh này đến một ngữ cảnh mới (chỉ đã xuất các biến sẽ có thể truy cập được), chạy tốt hơn mà không cần source. Khác, tôi không biết nếu có một thực hành tốt để ngăn chặn hành vi cụ thể bash này ... Yours có vẻ tốt. - Amessihel
Tôi cần phải sử dụng source bởi vì sourced.sh thực sự đặt một số biến env (và tôi không thể sửa đổi nó để xuất chúng vì nó là một tệp được xuất bản). - Gnubie
Nếu bạn biết bạn cần biến nào, bạn cũng có thể chuyển chúng theo cách này: VAR=VAL VAR2=VAL2 sourced.sh thay vì nguồn. - Amessihel