biến xuất không được duy trì sau khi thực thi tập lệnh


8

Tôi đang đối mặt với một vấn đề nghiêm trọng hơn. Tôi là một vm với solaris 11, và đang cố gắng viết một số tập lệnh bash.

nếu, trên vỏ, tôi gõ:

export TEST=aaa

và sau đó chạy:

set

Tôi thấy chính xác một biến môi trường mới có tên TEST có giá trị là aaa. Nếu, tuy nhiên về cơ bản tôi làm điều tương tự trong một kịch bản. khi tập lệnh kết thúc, tôi không thấy bộ biến. Để làm một ví dụ cụ thể, nếu trong tệp test.sh tôi có:

#!/usr/bin/bash
echo 1: $TEST   #variable not defined yet, expect to print only 1:
echo 2: $USER
TEST=sss
echo 3:  $TEST
export TEST
echo 4:  $TEST

nó in:

1:
2: daniele
3: sss
4: sss

và sau khi thực hiện, TEST không được đặt trong trình bao. Tui bỏ lỡ điều gì vậy? Tôi đã thử cả hai để xuất TEST = sss và bộ / xuất biến riêng biệt không có sự khác biệt.

Câu trả lời:


15

xuất - làm cho biến có sẵn cho các tiến trình con, nhưng không phải cho cha mẹ.

kịch bản nguồn - chạy trong shell mà không tạo tiến trình con

Đối với exalmpe, biến liên tục có thể được nhận ra bằng cách ghi vào tệp

#!/usr/bin/bash
echo 1: $TEST   #variable not defined yet, expect to print only 1:
CONFIGFILE=~/test-persistent.vars
if [ -r ${CONFIGFILE} ]; then
  # Read the configfile if it's existing and readable
  source ${CONFIGFILE}
fi
echo 2: $TEST
echo 3: $USER
TEST=sss
echo 4:  $TEST
echo TEST="$TEST"> ${CONFIGFILE}
echo 5:  $TEST

Đây cũng không phải là chính xác những gì tôi muốn đạt được, nhưng tôi đã nhận được quan điểm của bạn. cảm ơn.
Daniele

5

Để hiển thị các biến của bạn, bạn cần sourcetập lệnh xuất các biến của bạn. Xem man source.


1
có thể không có trang quản lý nguồn và help sourcethay vào đó bạn muốn có bash.
hầm

điều này hoạt động nếu tôi trực tiếp gọi tập lệnh, (nghĩa là nếu tôi lấy tập lệnh bằng cách xuất từ ​​trình bao), nhưng nó dường như không hoạt động nếu tôi lấy tập lệnh từ bên trong tập lệnh khác.
Daniele
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.