Làm cách nào để ngăn chặn nguồn dữ liệu của Viking trong tập lệnh bash truyền các đối số của tập lệnh?


5

Những câu hỏi này đề cập đến chức năng của source: Sự khác biệt giữa việc thực thi tập lệnh Bash so với tìm nguồn cung ứng là gì? 'Nguồn' làm gì?

nhưng tôi bối rối không biết tại sao việc gọi sourcemột kịch bản lại vượt qua các đối số của kịch bản. Ví dụ: tôi có 2 đoạn script này:

người gọi

source sourced.sh
source sourced.sh ""

nguồn gốc

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 việc thêm "" ngăn các đối số được thông qua. Đây có phải là cách được đề xuất để ngăn chặn các đối số được thông qua?


".. Khả năng tìm kiếm một tập lệnh với các đối số là một bashism .." Kiểm tra ở đây để biết thêm chi tiết.
Hastur

Câu trả lời:


5

sourcecho phép bạn thực thi một lệnh trong ngữ cảnh hiện tại (đối số $*một phần của ngữ cảnh ).

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


Cảm ơn, Amessihel. Là cuộc gọi thứ hai là cách được khuyến nghị để bỏ qua các đối số?
Gnubie

Nếu bạn muốn thực thi lệnh này đến một bối cảnh mới (chỉ các biến được xuất mới có thể truy cập được), tốt hơn là chạy nó mà không cần source. Khác, tôi không biết có một thực hành tốt để ngăn chặn hành vi cụ thể bash này ... Bạn có vẻ ổn.
Amessihel

Tôi cần sử dụng sourcevì nguồn gốc thực sự.sh đặt một số biến env (và tôi không thể sửa đổi nó để xuất chúng dưới dạng tệp được xuất bản).
Gnubie

Nếu bạn biết những biến nào bạn cần, bạn cũng có thể chuyển chúng theo cách này: VAR=VAL VAR2=VAL2 sourced.shthay vì nguồn.
Amessihel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.