Sự khác biệt giữa biến môi trường và biến shell


8

Người ta nói rằng các biến môi trường được kế thừa trong các tiến trình con nhưng các biến shell thì không. Tuy nhiên, thử nghiệm sau đây cho thấy các biến shell được nhìn thấy trong tiến trình con giống như các biến môi trường. Sự khác biệt là gì?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST

Câu trả lời:


9

Nhiệm vụ thứ hai của bạn TEST="SHELL_TEST"không xuất khẩu biến. Nó vẫn được đánh dấu là "được thừa kế bởi trẻ em". Và giá trị được thừa hưởng bởi đứa trẻ là giá trị hiện được đặt trong cha mẹ.
Nói cách khác, nhiệm vụ thứ hai của bạn không hoàn nguyên trạng thái của TESTbiến shell, nó vẫn là biến môi trường theo thuật ngữ đó.

Bạn sẽ phải hủy xuất nó để nó không được đặt trong các quy trình con:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$

Chào Mat, cảm ơn bạn đã trả lời. Vì vậy, sự hiểu biết của tôi (có hai biến có tên TEST, một biến cho biến môi trường và một biến cho biến shell, shell var TEST bóng env var TEST.) Không chính xác, chỉ có một biến trong Bash, nó luôn là biến shell và có thể là thiết lập để được xuất khẩu và hoạt động như một biến môi trường. Đây có phải là đặc thù của Bash và phụ thuộc vào việc thực hiện hay nó là phổ quát trong tất cả các shell. Cảm ơn bạn.
ning

Không chắc chắn về "phổ quát", nhưng ít nhất nó hoạt động tương tự với bash, ksh và zsh.
Mat

2
@ning Đây là cách tất cả các trình bao kiểu POSIX / Bourne hiện đại hoạt động (ash, ksh, bash, zsh). Có những phiên bản cổ của vỏ Bourne trong đó việc thay đổi biến vỏ xuất khẩu không làm thay đổi giá trị trong môi trường, nhưng bạn không thể gặp phải chúng nữa. Csh hoạt động khác đi, bạn vẫn có thể gặp phải điều đó trong môi trường lỗi thời nhưng nó cũng đã lỗi thời trong một thời gian.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Cảm ơn bạn đã làm rõ những gì đang xảy ra và tại sao. Như ai đó đã nói, mọi nhà phát triển Unix cũng nên là một nhà sử học.
ning
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.