Giả sử tôi có tệp tập lệnh bash config.sh
. Nó có nghĩa là được source'd bởi các kịch bản khác và các biến được định nghĩa được sử dụng như là tùy biến của các kịch bản cấp cao hơn.bash: xác định biến tập tin cục bộ vô hình để tìm kiếm mã script
Vấn đề là, nếu config.sh
có biến tạm thời và tên xung đột với biến tập lệnh cấp cao hơn, nó sẽ phá vỡ biến cấp cao hơn.
config.sh:
TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
thượng cấp kịch bản:
TMP1=def
source config.sh
echo $TMP1
Các echo
in cuối cùng abc
, không def
.
Giải pháp 1
giải pháp hiện tại của tôi là để nối thêm một chuỗi ngẫu nhiên để tên biến tạm thời để làm cho nó gần như không thể xung đột. ví dụ:
TMP1_vFc9Uiew=abc
CONFIG_INPUT_DIR="$TMP1_vFc9Uiew"/in
CONFIG_OUTPUT_DIR="$TMP1_vFc9Uiew"/out
unset TMP1_vFc9Uiew
gây đau đớn và làm cho mã khó đọc, ngoài việc không hoàn hảo.
Giải pháp 2 sử dụng local
từ khóa
Sau khi một số tìm kiếm, tôi đã đến để nhận biết local
từ khóa. Nhưng khi tôi chỉ cần khai báo TMP1
là local
, bash khiếu nại rằng config.sh: line 1: local: can only be used in a function
.
Vì vậy, giải pháp của tôi khác là kèm theo toàn bộ kịch bản cấu hình như một chức năng:
function config_func_rZ0Yqkpm() {
local TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
}
config_func_rZ0Yqkpm
unset config_func_rZ0Yqkpm
đó là tốt hơn so với giải pháp trước đó trong khả năng bảo trì và khả năng đọc, nhưng có một số khả năng xung đột cũng như giải pháp 1.
Câu hỏi
Tôi muốn biết giải pháp mạnh mẽ và thông minh hơn mà không có bất kỳ khả năng xung đột nào.
Cảm ơn.
'ssh-agent' sử dụng một kỹ thuật tương tự, với các tùy chọn' -c' và '-s'. – jjlin
@jjlin: Cảm ơn bạn! Tôi nghĩ rằng 'keychain' không chính xác là nơi tôi nhìn thấy nó đầu tiên, nhưng nó là nơi đầu tiên tôi tìm thấy tài liệu. :) Buồn cười, nó đang ngồi ngay tại cửa sổ mở trong trang 'ssh-agent' ... – sarnold
@sarnold: Tuyệt vời, cảm ơn bạn! Tôi sẽ thử kỹ thuật này. – niboshi