Tập lệnh BASH để đặt các biến môi trường không hoạt động


137

Tôi đã viết đoạn script sau để đặt một số biến môi trường khi cần.

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

Bên dưới lệnh và kết quả tôi có thể thấy trên thiết bị đầu cuối của mình: tập lệnh chạy, nhưng các biến không được đặt ở cuối.

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

Chuyện gì vậy? Cảm ơn trước. Mirko

Câu trả lời:


194

exportxuất phép gán biến cho các tiến trình con của shell trong đó exportlệnh được chạy. Môi trường dòng lệnh của bạn là cha mẹ của shell script, vì vậy nó không nhìn thấy phép gán biến.

Bạn có thể sử dụng lệnh .(hoặc source) bash để thực thi các lệnh script trong môi trường shell hiện tại và đạt được những gì bạn muốn, ví dụ:

source ./script.sh
echo "$BASE"

Sẽ sản xuất

/home/develop/trees

Các sourcelệnh, thường thấy trong kịch bản, là một từ đồng nghĩa bash cho ., mà là một phần của tiêu chuẩn POSIX (vì vậy .có sẵn trong dấu gạch ngang, ví dụ, nhưng sourcekhông phải là).

. ./script.sh     # identical to "source ./script.sh"

( . script.shsource script.shđầu tiên sẽ tìm kiếm script.shtrong PATH, vì vậy nó an toàn hơn để xác định đường dẫn đến script.sh.)


29
Bạn không cần exportchuyển các biến cho các lớp con, một lớp con là bản sao của lớp vỏ hiện tại của bạn, bao gồm các biến và hàm, v.v. Thứ hai, .là lệnh POSIX để tìm nguồn cung ứng. Bash thêm vào sourcenhư một từ đồng nghĩa dễ đọc hơn cho nó, nhưng bạn không thể dựa vào nó có sẵn trong sh. Cuối cùng . ./scriptthay vì . scriptnếu bạn muốn tránh những điều bất ngờ. mywiki.wooledge.org/BashFAQ/060
geirha

Lưu ý rằng nếu bạn lấy một tập lệnh VÀ sử dụng đường ống thì môi trường có nguồn gốc không có sẵn cho cha mẹ. ví dụ 'nguồn setit.sh' là được. 'nguồn setit.sh | tee setit.log' không ổn. Thật ngạc nhiên. Không trực quan.
gaoithe

10

Khi bạn chạy một tập lệnh, nó sẽ chạy trong một khung con. Các biến chỉ có giá trị trong bối cảnh của lớp con đó. Đặt chúng trong .bashrchoặc của bạn .profilevà đọc lên các biến và subshells . Câu exportlệnh hoạt động xuống hierachy (shell hiện tại và tất cả các subshells) không hoạt động như trong ví dụ của bạn.

Ngoài ra (nếu bạn thực sự muốn tập lệnh ảnh hưởng đến môi trường của trình bao hiện tại của bạn) hãy chạy nó dưới dạng:

. ./script.sh

Điều đó khiến nó chạy trong trình bao hiện tại của bạn nhưng cũng sẽ không chuyển các biến lên cấu trúc phân cấp.


5

Tôi thường muốn đặt một biến môi trường mà không gặp rắc rối.

Đây là những gì tôi thêm vào .bashrc của mình để thực hiện sự thuận tiện này.

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}

-1

Bạn có thể thử một cái gì đó như thế này

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
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.