Hãy để chúng tôi xem xét một ví dụ cụ thể. Các grep
lệnh sử dụng một biến môi trường được gọi là GREP_OPTIONS
để thiết lập tùy chọn mặc định.
Hiện nay. Cho rằng tệp test.txt
chứa các dòng sau:
line one
line two
chạy lệnh grep one test.txt
sẽ trở lại
line one
Nếu bạn chạy grep với -v
tùy chọn, nó sẽ trả về các dòng không khớp, vì vậy đầu ra sẽ là
line two
Bây giờ chúng tôi sẽ cố gắng đặt tùy chọn với một biến môi trường.
Các biến môi trường được đặt mà không có export
sẽ không được kế thừa trong môi trường của các lệnh bạn đang gọi.
GREP_OPTIONS='-v'
grep one test.txt
Kết quả:
line one
Rõ ràng, tùy chọn -v
đã không được thông qua grep
.
Bạn muốn sử dụng biểu mẫu này khi bạn chỉ đặt một biến cho trình bao sử dụng, ví dụ như trong for i in * ; do
bạn không muốn xuất $i
.
Tuy nhiên, biến được truyền vào môi trường của dòng lệnh cụ thể đó, vì vậy bạn có thể làm
GREP_OPTIONS='-v' grep one test.txt
sẽ trả lại dự kiến
line two
Bạn sử dụng biểu mẫu này để tạm thời thay đổi môi trường của trường hợp cụ thể này của chương trình được khởi chạy.
Xuất một biến làm cho biến được kế thừa:
export GREP_OPTIONS='-v'
grep one test.txt
trả lại ngay
line two
Đây là cách phổ biến nhất để thiết lập các biến để sử dụng các quy trình được bắt đầu sau đó trong trình bao
Điều này đã được thực hiện trong bash. export
là một bash dựng sẵn; VAR=whatever
là cú pháp bash. env
, mặt khác, là một chương trình trong chính nó. Khi env
được gọi, những điều sau đây xảy ra:
- Lệnh
env
được thực thi như một tiến trình mới
env
sửa đổi môi trường và
- gọi lệnh được cung cấp như là một đối số. Các
env
quá trình được thay thế bằng các command
quá trình.
Thí dụ:
env GREP_OPTIONS='-v' grep one test.txt
Lệnh này sẽ khởi chạy hai quy trình mới: (i) env và (ii) grep (thực ra, quy trình thứ hai sẽ thay thế quy trình đầu tiên). Từ quan điểm của grep
quá trình, kết quả hoàn toàn giống như chạy
GREP_OPTIONS='-v' grep one test.txt
Tuy nhiên, bạn có thể sử dụng thành ngữ này nếu bạn ở ngoài bash hoặc không muốn khởi chạy shell khác (ví dụ: khi bạn đang sử dụng exec()
họ hàm thay vì system()
cuộc gọi).
Ghi chú thêm về #!/usr/bin/env
Đây cũng là lý do tại sao thành ngữ #!/usr/bin/env interpreter
được sử dụng chứ không phải #!/usr/bin/interpreter
. env
không yêu cầu một đường dẫn đầy đủ đến một chương trình, bởi vì nó sử dụng execvp()
hàm tìm kiếm thông qua PATH
biến giống như shell, và sau đó tự thay thế bằng lệnh chạy. Do đó, nó có thể được sử dụng để tìm ra nơi một trình thông dịch (như perl hoặc python) "ngồi" trên đường dẫn.
Điều đó cũng có nghĩa là bằng cách sửa đổi đường dẫn hiện tại, bạn có thể ảnh hưởng đến biến thể python nào sẽ được gọi. Điều này làm cho những điều sau đây có thể:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
thay vì ra mắt Calibre, sẽ dẫn đến
I am an evil interpreter!
export key=value
là cú pháp mở rộng và không nên được sử dụng trong các tập lệnh di động (nghĩa là#! /bin/sh
).