Tôi có thể chạy ENV_VAR=value command
để chạy command
với một giá trị cụ thể cho ENV_VAR
. Là những gì tương đương với bỏ đặt ENV_VAR
cho command
?
cmd
cho điều đó.
Tôi có thể chạy ENV_VAR=value command
để chạy command
với một giá trị cụ thể cho ENV_VAR
. Là những gì tương đương với bỏ đặt ENV_VAR
cho command
?
cmd
cho điều đó.
Câu trả lời:
Khác với -i
tùy chọn xóa sạch toàn bộ môi trường, POSIX env
không cung cấp bất kỳ cách nào để bỏ đặt một biến.
Tuy nhiên, với một vài env
triển khai (bao gồm busybox
ít nhất là GNU, 'và FreeBSD), bạn có thể thực hiện:
env -u ENV_VAR command
Cái nào sẽ hoạt động trong việc loại bỏ mọi trường hợp của một ENV_VAR
biến khỏi môi trường (lưu ý rằng nó không hoạt động với biến môi trường với một tên trống ( env -u ''
có thể gây ra lỗi hoặc không hiệu quả tùy thuộc vào việc triển khai mặc dù tất cả đều chấp nhận env '=value'
, có thể là một hạn chế phát sinh bởi unsetenv()
hàm C mà POSIX yêu cầu trả về lỗi cho chuỗi trống, trong khi không có giới hạn nào như vậy putenv()
)).
Có thể di chuyển (trong vỏ POSIX), bạn có thể làm:
(unset -v ENV_VAR; exec command)
(lưu ý rằng với một số shell, việc sử dụng exec
có thể thay đổi command
đang chạy: chạy cái trong hệ thống tập tin thay vì chức năng hoặc ví dụ dựng sẵn (và sẽ bỏ qua alias
việc mở rộng rõ ràng), như env
trên. Bạn muốn bỏ qua nó trong những trường hợp đó) .
Nhưng điều đó sẽ không hoạt động đối với các biến môi trường có tên không thể ánh xạ tới biến shell (lưu ý rằng một số shell như thế mksh
sẽ loại bỏ các biến đó khỏi môi trường khi khởi động) hoặc các biến được đánh dấu chỉ đọc.
-v
là cho vỏ Bourne và bash
có unset
mà không -v
thể bỏ đặt một ENV_VAR
chức năng nếu không có biến bằng tên đó. Hầu hết các shell khác sẽ không hủy chức năng trừ khi bạn vượt qua -f
tùy chọn. (không có khả năng tạo ra sự khác biệt trong thực tế).
(Cũng hãy cẩn thận với lỗi / lỗi sai của bash
/ mksh
/ yash
người unset
, trong một số trường hợp có thể không bỏ đặt biến, nhưng tiết lộ biến trong phạm vi bên ngoài )
Nếu perl
có sẵn, bạn có thể làm:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
Mà sẽ làm việc ngay cả đối với biến môi trường với một tên trống.
Bây giờ tất cả những thứ đó sẽ không hoạt động nếu bạn muốn thay đổi biến môi trường cho hàm dựng sẵn hoặc hàm và không muốn chúng chạy trong một mạng con, như trong bash
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(ở đây bỏ chọn LANG như một cách tiếp cận sai lầm trong việc đảm bảo .
được sử dụng và được hiểu là dấu phân cách thập phân. Sẽ tốt hơn khi sử dụng LC_ALL=C printf...
cho điều đó)
Với một số shell, thay vào đó, bạn có thể tạo một phạm vi cục bộ cho biến bằng cách sử dụng hàm:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
Với zsh
, bạn cũng có thể sử dụng một chức năng ẩn danh:
(){local ENV_VAR; command}
Cách tiếp cận đó sẽ không hoạt động trong một số shell (như các shell dựa trên shell Almquist), người local
không khai báo biến là không đặt ban đầu (nhưng kế thừa giá trị và thuộc tính). Trong những điều đó, bạn có thể làm local ENV_VAR; unset ENV_VAR
, nhưng đừng làm điều đó trong mksh
hoặc yash
( typeset
thay vì local
cho điều đó) vì điều đó sẽ không hiệu quả, unset
sẽ chỉ hủy bỏ local
.
Cũng lưu ý rằng trong bash
, cục bộ ENV_VAR
(ngay cả khi chưa đặt) sẽ giữ lại thuộc tính xuất . Vì vậy, nếu command
là một hàm gán giá trị cho ENV_VAR
, biến sẽ có sẵn trong môi trường của các lệnh được gọi sau đó. unset ENV_VAR
sẽ xóa thuộc tính đó. Hoặc bạn có thể sử dụng local +x ENV_VAR
nó cũng sẽ đảm bảo một bảng rõ ràng (trừ khi biến đó được khai báo chỉ đọc, nhưng sau đó bạn không thể làm gì về nó bash
).
env '=foo' python -c 'import os; print os.environ[""]'
. Tôi không mong đợi nhiều người muốn đặt một biến như thế.
Không có tương đương trực tiếp như tôi biết; bạn có thể sử dụng một subshell:
(unset ENV_VAR; exec command)
(unset ENV_VAR; exec somecommand)
nếu bạn muốn tương đương với bản gốc về hiệu quả (bằng cách tiêu thụ phần phụ). Như nó là, điều này thêm một ngã ba thêm.
command
là lệnh cuối cùng trong lệnh gọi subshell.
env -u
.
Bạn có thể dùng ENV_VAR= command
Điều này không thực sự bỏ đặt biến, nhưng nó có thể hữu ích trong nhiều trường hợp (tập lệnh shell thường chỉ sử dụng test -n
để kiểm tra xem một biến có được đặt không):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
command
là một sự lựa chọn đáng tiếc của các trình giữ chỗ, vì thực sự có một lệnh tích hợp theo tên đó.mycommand
hoặcsomecommand
như vậy có thể là một thói quen tốt hơn để tham gia.