Theo cách tương thích với posix hoạt động với nhiều triển khai, làm cách nào tôi có thể in danh sách biến môi trường được xác định hiện tại mà không có giá trị của chúng?
Trên một số triển khai (mksh, freebsd / bin / sh), chỉ cần sử dụng export
chính nó sẽ phù hợp với hóa đơn:
$ export
FOO2
FOO
Nhưng đối với một số triển khai khác (bash, zsh, dash), export
cũng hiển thị giá trị. Với bash, ví dụ:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
Các tùy chọn khác như env
hoặc printenv
không có tùy chọn chỉ in tên biến mà không có giá trị, ít nhất là không phải trên nền tảng linux và freebsd mà tôi đã thử.
Đường ống đến awk / sed / vv. hoặc cắt xén danh sách với các kỹ thuật mở rộng tham số (ví dụ ${foo%%=*}
:) có thể chấp nhận được, nhưng nó phải hoạt động với các giá trị có thể trải dài các dòng và có =
và khoảng trắng trong giá trị (xem ví dụ ở trên).
Câu trả lời cụ thể cho việc triển khai shell cụ thể rất thú vị, nhưng tôi chủ yếu tìm kiếm thứ gì đó tương thích với các triển khai.
export -p
cho việc này?
export -p
vì điều đó sẽ cung cấp cho bạn một đầu ra nhất quán trên tất cả các vỏ POSIX, mà bạn nói rằng bạn muốn.
export -p
không phù hợp với yêu cầu đầu tiên - chỉ in tên biến mà không có giá trị.
export -p
. Tôi sẽ không viết phân tích cú pháp đó, vì trong trường hợp chung, nó cũng sẽ phải phân tích cú pháp trích dẫn thích hợp, trong trường hợp bạn có một biến có giá trị giống như thế hello\nexport var=value
. Một trong số ít các lệnh khác sẽ cung cấp cho bạn đầu ra nhất quán trong tất cả các vỏ POSIX là env
, nhưng đầu ra đó khó phân tích hơn vì nó thiếu export =
bit.
export -p
được chỉ định bởi POSIX để tạo đầu ra cũng phù hợp với đầu vào trong trình bao.