Làm thế nào để bạn xác định liệu các biến shell được xuất khẩu hay không?


13

Với họ shell Bourne, tất cả các biến shell đều có tên chữ hoa; có nghĩa là bạn không thể biết một biến cụ thể có phải là biến môi trường hay không chỉ bằng cách nhìn vào tên của nó. Làm thế nào để bạn xác định biến shell Bourne nào là cục bộ (chỉ được xác định trong shell hiện tại)?


4
Vỏ Bourne hay vỏ Bourne-lại? Bạn có thể chỉ ra một tài liệu tham khảo cho điều biến chữ hoa?
Jeff Schaller

Trong shell Bourne-again vì tất cả các biến là chữ hoa, làm thế nào bạn có thể xác định biến bash nào là cục bộ?
Shoulderpadz

7
@Shoulderpadz không có gì ngăn cản bạn tạo các biến chữ thường.
muru

1
Theo địa phương, bạn có nghĩa là các biến chưa được xuất khẩu?
Eliah Kagan

4
Sự khác biệt mà bạn đang hỏi là biến shell và biến môi trường, không phải toàn cục so với cục bộ. Lưu ý rằng có các biến shell không phải là biến môi trường (nghĩa là cái mà bạn đang gọi là "cục bộ") và có các biến môi trường không phải là biến shell (môi trường có thể chứa các tên không phải là định danh shell hợp lệ, và do đó không thể là biến).
chepner

Câu trả lời:


17

Nếu bạn muốn xem một biến có được xuất hay không, hãy sử dụng declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

Cách di động nhất là export -p.

export -pliệt kê các biến xuất khẩu. Điều này thường giống như declare -x, nếu vỏ của bạn có declare.

Các vỏ kiểu Bourne hiện đang sử dụng nên hỗ trợ export -p, theo yêu cầu của POSIX :

Khi -p được chỉ định, xuất sẽ ghi vào đầu ra tiêu chuẩn tên và giá trị của tất cả các biến được xuất, theo định dạng sau:

"export %s=%s\n", <name>, <value>

nếu tên được đặt và:

"export %s\n", <name>

nếu tên không được đặt.

Tiêu chuẩn tiếp tục giải thích rằng giá trị của biến được hiển thị theo cách thường cho phép nó được sử dụng sau này ở phía bên phải của =một bài tập. Điều này để nói rằng nó có thể được trích dẫn. Các vỏ khác nhau có thể hiển thị chúng khác nhau nhưng có cùng hiệu ứng. export -phoạt động ngay cả trong các shell không có declarenội dung, như Dash .

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

Tôi đã dẫn đầu ra grepcho gọn nhẹ nhưng nếu bạn không lọc nó thì bạn sẽ có được danh sách đầy đủ các biến đã xuất. Từ câu hỏi của bạn, có vẻ như đó là những gì bạn có thể thấy hữu ích nhất.

Một số hệ vỏ, như Bash, sử dụng định dạng không chuẩn trừ khi được hướng dẫn rõ ràng để hành xử theo cách tuân thủ POSIX. Trong Bash export -pcho đầu ra giống như declare -xmặc định.

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

Zsh hiển thị định dạng không chuẩn ngay cả khi bật tính năng tương thích POSIX:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

Trong mọi trường hợp, bạn có thể trích xuất các biểu diễn di động (có thể được trích dẫn) bằng cách tìm kiếm một từ theo sau =. Điều này không dựa vào các từ trước đó trên dòng, miễn là chúng không xuất hiện ngay trước =, điều mà chúng không nên. Ví dụ:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

Lưu ý rằng không phải tất cả các mục nhất thiết phải có =. Điều này là do các biến có thể không được đặt nhưng được xuất. Các mục đó được lọc ra bằng greplệnh trên, có thể hoặc không thể là những gì bạn muốn.

Hầu hết thời gian, bạn chỉ muốn kiểm tra đầu ra và do đó bạn sẽ không quan tâm nếu các mục đều bắt đầu bằng export, declare -x, typeset -x, hay cái gì khác. Sau đó chỉ cần chạy export -p.

Tôi đã thử nghiệm các lệnh đó trên Ubuntu 16.04 LTS với các phiên bản được đóng gói chính thức của mỗi vỏ.


0

Các biến KHÔNG được xuất có thể được nhìn thấy từ đầu ra của declarelệnh trong bash.

Các biến được xuất có thể được nhìn thấy từ đầu ra declare -xhoặc exportlệnh trong bash.

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.