RANDOM
không phải là một biến môi trường. Đó là một biến vỏ được duy trì bởi một số vỏ. Nó thường không được xuất theo mặc định. Đây là lý do tại sao nó không hiển thị trong đầu ra của env
.
Khi nó được sử dụng ít nhất một lần, nó sẽ hiển thị trong đầu ra của set
chính nó, liệt kê các biến shell (và hàm) và các giá trị của chúng trong phiên shell hiện tại. Hành vi này phụ thuộc vào trình bao và sử dụng pdksh
trên OpenBSD, RANDOM
sẽ được liệt kê set
ngay cả khi không được sử dụng trước đó.
Phần còn lại của câu trả lời này liên quan đến những gì có thể xảy ra nếu RANDOM
được xuất khẩu (tức là biến thành một biến môi trường).
Xuất nó với nó export RANDOM
sẽ biến nó thành một biến môi trường nhưng việc sử dụng nó sẽ bị hạn chế nghiêm trọng vì giá trị của nó trong một tiến trình con sẽ là "ngẫu nhiên nhưng tĩnh" (có nghĩa là nó sẽ là một số ngẫu nhiên không thay đổi). Các hành vi chính xác khác nhau giữa các vỏ.
Tôi đang sử dụng pdksh
trên OpenBSD trong ví dụ dưới đây và tôi nhận được một giá trị ngẫu nhiên mới trong mỗi lần awk
chạy (nhưng cùng một giá trị mỗi lần trong cùng một awk
ví dụ). Sử dụng bash
, tôi sẽ nhận được chính xác cùng một giá trị ngẫu nhiên trong tất cả các yêu cầu awk
.
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
25444 25444
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
30906 30906
Trong bash
, giá trị xuất của RANDOM
sẽ vẫn tĩnh bất kể việc sử dụng RANDOM
trong trình bao (trong đó mỗi lần sử dụng $RANDOM
vẫn sẽ cho một giá trị mới).
Điều này là do mỗi tham chiếu đến biến vỏ RANDOM
trong bash
làm cho việc tiếp cận vỏ nội bộ của mình get_random()
chức năng để cung cấp cho các biến một giá trị ngẫu nhiên mới, nhưng vỏ không cập nhật các biến môi trường RANDOM
. Điều này tương tự trong hành vi như với động khác bash
biến, chẳng hạn như LINENO
, SECONDS
, BASHPID
, vv
Để cập nhật biến môi trường RANDOM
trong bash
, bạn sẽ phải gán cho nó giá trị của biến shell RANDOM
và tái xuất nó:
export RANDOM="$RANDOM"
Tôi không rõ liệu điều này có tác dụng phụ bổ sung cho việc tái tạo hạt giống số ngẫu nhiên trong bash
hay không (nhưng một phỏng đoán có giáo dục sẽ là nó không).
env
không phải là lệnh shell vì nó thường không được tích hợp vào shell.