Sự khác biệt giữa env, setenv, export và khi nào nên sử dụng?


16

Gần đây tôi nhận thấy chúng ta có 3 tùy chọn để đặt biến môi trường:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Nếu có những cách khác, xin vui lòng khai sáng cho chúng tôi.

Khi nào tôi nên thích cái này hơn cái kia? Xin đề nghị hướng dẫn.

Đối với khả năng tương thích shell, đó là mở rộng nhất (bao gồm nhiều phương ngữ vỏ)?

Tôi đã nhận thấy câu trả lời này nhưng tôi muốn mở rộng câu hỏi với envvà hướng dẫn ưu tiên sử dụng.

Câu trả lời:


12

export VARIABLE_NAME='some value'là cách để thiết lập một biến môi trường trong bất kỳ vỏ POSIX-compliant ( sh, dash, bash, ksh, vv .; cũng Zsh). Nếu biến đã có giá trị, bạn có thể sử dụng export VARIABLE_NAMEđể biến nó thành biến môi trường mà không thay đổi giá trị.

Các shell Bourne Pre-POSIX không hỗ trợ điều này, đó là lý do tại sao bạn sẽ thấy các tập lệnh tránh export VARIABLE_NAME='some value'và sử dụng VARIABLE_NAME='some value'; export VARIABLE_NAMEthay thế. Nhưng vỏ Bourne trước POSIX là cực kỳ hiếm hiện nay.

setenv VARIABLE_NAME='some value'là cú pháp csh để đặt biến môi trường. Không giống như trong sh , setenv VARIABLE_NAME. setenvkhông tồn tại trong sh và csh cực kỳ hiếm khi được sử dụng trong các tập lệnh và đã bị vượt qua bởi bash để sử dụng tương tác trong 20 năm qua (và zsh thậm chí lâu hơn), vì vậy bạn có thể quên nó trừ khi bạn gặp phải nó.

Các envlệnh là rất hiếm khi hữu ích trừ dòng công việc . Khi được gọi mà không có đối số, nó sẽ hiển thị môi trường, nhưng exportnó sẽ tốt hơn (được sắp xếp và thường được trích dẫn để phân biệt các dòng mới trong các giá trị từ các dòng mới tách các giá trị. Khi được gọi với các đối số, nó chạy một lệnh với các biến môi trường bổ sung, nhưng cùng một lệnh mà không có envcũng hoạt động ( VAR=value mycommandchạy mycommandvới VARthiết lập value, giống như env VAR=value mycommand). Lý do envrất hữu ích trong dòng shebang là nó thực hiện PATHtra cứu và nó không làm gì khác khi được gọi bằng tên lệnh. envLệnh này có thể hữu ích để chạy lệnh với chỉ một vài biến môi trường với-ihoặc không có tham số để hiển thị môi trường bao gồm các biến có tên không hợp lệ mà shell không nhập.


2

Đặt một biến như VAR='asdf'môi trường không được sửa đổi, có nghĩa là các chương trình bạn khởi chạy trong cùng một phiên sẽ không biết gì VARvà sẽ không thể truy cập vào nó. Bạn muốn hành vi này khi viết kịch bản shell.

exportmặt khác, là một bash dựng sẵn để sửa đổi môi trường, do đó làm cho biến xuất được hiển thị cho các tiến trình con được sinh ra trong phiên hiện tại. Bạn có thể đạt được điều tương tự bằng cách chạy VAR='asdf' %program_name%.

envkhông phải là một nội dung, mà là một chương trình của chính nó. Nhìn bề ngoài, nó hoạt động chính xác như khi bạn VAR='asdf' %program_name%, nhưng ở cấp độ thấp hơn mọi thứ sẽ phức tạp hơn một chút. Đầu tiên, envđược đưa ra. Nó sửa đổi môi trường, sau đó thực thi lệnh với các đối số đã cho. Hành vi tương tự bạn có thể đạt được trong mã của riêng bạn bằng cách sử dụng lệnh gọi hệ thống exec (3) .

setenvchỉ là exporttrong vỏ csh-gia đình, như đã nêu trong câu trả lời của bạn.


1
Trong shell hiện đại, VAR=asdfkhông cập nhật môi trường nếu VARđã có trong môi trường. (Điều này không đúng trong vỏ Bourne ban đầu.)
Gilles 'SO- ngừng trở thành ác quỷ'

1
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.