Làm thế nào để chạy một chương trình trong một môi trường sạch trong bash?


Câu trả lời:


127

Bạn có thể làm điều này với env:

env -i your_command

Trái ngược với những ý kiến dưới đây, điều này không hoàn toàn rõ ràng ra môi trường, nhưng nó không ngăn chặn your_commandthiết lập các biến mới. Cụ thể, chạy shell sẽ khiến /etc/profilecho chạy và shell cũng có thể có một số cài đặt tích hợp.

Bạn có thể kiểm tra điều này với:

env -i env

tức là lau môi trường và sau đó in nó. Đầu ra sẽ trống.


4
Nó không hoàn toàn xóa môi trường: echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shbản in /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
l0b0

2
Tuy nhiên, có vẻ như đây là gần nhất bạn có thể nhận được - Nó có vẻ như biến như PATH, PWDSHLVLđược thiết lập tự động bằng Bash. +1.
l0b0

3
@ I0b0: Xem chỉnh sửa của tôi.
am

3
Biến PATH trong tập lệnh của người bình luận đầu tiên không có trong môi trường và do đó không phải là biến môi trường. Bash rõ ràng đặt biến vỏ thường xuyên của riêng nó được gọi là PATH nếu không có một biến nào được xuất cho nó: env -i bash --norc -c "declare -p PATH"cho declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.". Lưu ý "-x" cho xuất khẩu (và do đó là một phần của môi trường) nếu bạn tự xuất nó: env -i bash --norc -c "export PATH; declare -p PATH"chodeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Binary Phile

34

Một bashmôi trường "sạch" có thể có

$ env -i bash --noprofile --norc
  • Các env -ilệnh thực thi lệnh cho nó trên dòng lệnh mà không chuyển bất kỳ của các biến môi trường xuất khẩu của môi trường vỏ cũ sang môi trường của chương trình thực thi.

  • Các --noprofiletùy chọn dừng lại bashtừ việc đọc kịch bản trên toàn hệ thống hoặc khởi tạo vỏ cá nhân mà nếu không sẽ được đọc trong một vỏ đăng nhập.

  • Các --norctùy chọn dừng lại bashtừ việc đọc các kịch bản khởi tạo vỏ cá nhân mà nếu không sẽ được đọc cho một vỏ tương tác.


Env của tôi không nhận ra những lựa chọn đó.
Paulo Carvalho

@PauloCarvalho Hệ thống của bạn không hỗ trợ env -i? Bạn đang trên hệ thống nào?
Kusalananda

Xin lỗi, nó hoạt động trong vỏ. Tôi đã cố gắng đưa nó vào một kịch bản và bằng cách nào đó nó đã gây ra lỗi.
Paulo Carvalho

@PauloCarvalho Xin lỗi, tôi không thể thấy lệnh bạn đã nhập hoặc lỗi bạn gặp phải là gì.
Kusalananda

Tuyệt vời - đúng như những gì tôi đang tìm kiếm. envđể làm sạch môi trường của tôi và --noprofileđể tránh tìm nguồn cung ứng / etc / profile và bạn bè, và --norcđể tránh tìm nguồn cung ứng ~ / .bashrc và bạn bè.
Felipe Alvarez

28

env -i somecommandchạy một lệnh trong một môi trường trống, như ams đã đề cập .

Rất nhiều chương trình dựa trên một số biến môi trường quan trọng, vì vậy bạn có thể muốn giữ lại chúng:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

Ngoài ra, bạn có thể đăng nhập vào một môi trường thời gian đăng nhập nhỏ.

ssh localhost somecommand

1
Hoạt động khi chạy lệnh trên cmdline. Làm thế nào để tôi đặt cái này trong shebang?, Dường như không hoạt động !
balki

Thật kỳ lạ, tôi envkhông hỗ trợ --phân định và env -i FOO=bar -- envcố gắng chạy một lệnh có tên --.
antak

@antak Điều đó nên env -i -- FOO=bar env, thực sự. Lỗi của tôi. Không phải --là hữu ích vì những gì tiếp theo nó không bắt đầu với -.
Gilles

Không nhận ra bạn luôn có thể ssh vào localhost, điều đó hơi lạ. Trường hợp sử dụng là gì.
Edgar Aroutiounian

@EdgarAroutiounian Bạn có thể SSH đến localhost nếu nó đang chạy máy chủ SSH. Tại sao các lập trình viên sẽ trải qua nỗ lực cấm nó?
Gilles

4

Trong khi câu trả lời được chấp nhận là chính xác, điều bạn thường muốn làm là:

env -i bash -l -c "printenv; and any other commands"

Điều này cung cấp cho bạn bash trần nhưng chức năng (giống như bạn nhận được khi đăng nhập ở chế độ không tương tác). Ví dụ này đặt ngôn ngữ, múi giờ, TRANG CHỦ, v.v.


Điều đó không hoàn toàn hiệu quả bởi vì env -ixóa HOME, có nghĩa là bash -lkhông thể tìm thấy của bạn, .bash_profilev.v. Nếu bạn muốn có một cái vỏ giống như những gì bạn nhận được khi đăng nhập mới, bạn cần thêm một hướng dẫn để đặt HOMEtrước.
Elliott tàn sát


1

Vấn đề với hầu hết các câu trả lời ở đây là rõ env -iràng HOME, vì vậy ngay cả khi bạn chạy bash -lvào bên trong, nó sẽ không đọc của bạn, .bash_profilev.v ... Nếu thứ bạn đang tìm kiếm là một cái vỏ hoạt động như thể bạn vừa đăng nhập mới, bạn Thay vào đó, tôi muốn điều này:

env -i HOME="$HOME" bash -l -c 'your_command'

Thí dụ:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

1
Lưu ý rằng một bashvỏ đăng nhập sẽ chạy .bash_loginhoặc .bash_profile. Để có được một môi trường sạch, hãy sử dụng --noprofilehoặc đặt HOMEthành một thư mục không có các tệp đó. Tôi cho rằng nó phụ thuộc vào ý của bạn là "sạch".
Kusalananda

1
Có, nếu bạn muốn một cái vỏ không có gì theo nghĩa đen, chỉ cần làm theo câu trả lời ban đầu và làm env -i bash -c .... Câu trả lời này là cụ thể khi bạn muốn có một vỏ trông giống như bạn vừa đăng nhập mới trên máy.
Elliott tàn sát

0

Để trả lời bình luận của balki (và trả lời câu hỏi của riêng tôi trong quá trình :-):

% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43

==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.

#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh

echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."

Khi tôi thử điều này trong dòng shebang của mình trong CentOS 7.6, tôi gặp lỗi này từ env:/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

Nếu tôi thay đổi tập lệnh để sử dụng đối số dài --ignore-environmentthì tôi nhận được điều này:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.
ScottJ
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.