bash의 깨끗한 환경에서 프로그램을 실행하는 방법은 무엇입니까?


답변:


127

당신은 이것을 할 수 있습니다 env:

env -i your_command

반대로 아래의 의견에,이 수행 환경 밖으로 완전히 명확하지만, 방해하지 않는 your_command새 변수를 설정. 특히, 셸을 실행하면가 실행되고 셸 /etc/profile에도 일부 내장 설정이있을 수 있습니다.

다음을 통해 확인할 수 있습니다.

env -i env

즉, 환경을 닦은 다음 인쇄하십시오. 출력이 공백입니다.


4
환경을 완전히 정리하지는 않습니다 : echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shprints /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
l0b0

2
그러나, 이것은 당신이 얻을 수있는 가장 가까운 것 - 그것은 같은 변수 것 같아 PATH, PWD그리고 SHLVL배쉬에 의해 자동으로 설정됩니다. +1.
l0b0

3
@ I0b0 : 나의 편집을보십시오.
AMS

3
첫 번째 주석 작성기 스크립트의 PATH 변수는 환경에 있지 않으므로 환경 변수가 아닙니다. Bash는 PATH라는 자체 셸 변수를 설정 env -i bash --norc -c "declare -p PATH"합니다 declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.". 직접 내보내는 경우 내 보낸 (및 환경의 일부) "-x"에 유의하십시오. env -i bash --norc -c "export PATH; declare -p PATH"제공declare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Binary Phile

34

"깨끗한" bash환경은

$ env -i bash --noprofile --norc
  • env -i명령은 실행 프로그램의 환경 이전 셀 환경의 수출 환경 변수 중 하나를 전송하지 않고 커맨드 라인에 주어진 명령을 실행한다.

  • --noprofile옵션 bash은 로그인 쉘에 대해 읽히는 시스템 전체 또는 개인 쉘 초기화 스크립트 읽기를 중지합니다 .

  • --norc옵션 bash은 대화식 쉘에 대해 읽히는 개인 쉘 초기화 스크립트 읽기를 중지합니다 .


내 env가 해당 옵션을 인식하지 못합니다.
Paulo Carvalho

@PauloCarvalho 시스템이 지원하지 env -i않습니까? 어떤 시스템을 사용하고 있습니까?
Kusalananda

죄송합니다. 셸에서 작동합니다. 스크립트에 넣으려고했는데 어떻게 든 오류가 발생했습니다.
Paulo Carvalho

@PauloCarvalho 죄송합니다. 입력하신 명령이나 오류가 무엇인지 확인할 수 없습니다.
Kusalananda

좋아-내가 찾던 것. env내 환경을 청소하고 --noprofile/ etc / profile과 친구들의 --norc소싱을 피하고 ~ / .bashrc와 친구들의 소싱을 피하기 위해.
Felipe Alvarez

28

env -i somecommandams가 이미 언급했듯이 빈 환경에서 명령을 실행합니다 .

많은 프로그램이 몇 가지 중요한 환경 변수에 의존하므로이를 유지하고자 할 수 있습니다.

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

또는 작은 로그인 시간 환경에 로그인 할 수 있습니다.

ssh localhost somecommand

1
cmdline에서 명령을 실행할 때 작동합니다. 어떻게하지 않는 것? 내가 오두막에 넣고 할 !
balki

이상하게도 my env--구분을 지원하지 않으며 env -i FOO=bar -- env라는 이름의 명령을 실행하려고 시도합니다 --.
antak

@antak env -i -- FOO=bar env실제로 이어야합니다 . 내 잘못이야. 그 --뒤에 오는 것이로 시작하지 않기 때문에 유용하지 않습니다 -.
Gilles

항상 localhost로 ssh 할 수 있다는 것을 몰랐습니다. 정말 이상합니다. 유스 케이스는 무엇입니까?
Edgar Aroutiounian

@EdgarAroutiounian SSH 서버를 실행중인 경우 localhost에 SSH를 연결할 수 있습니다. 프로그래머가이를 금지하려는 노력을하는 이유는 무엇입니까?
Gilles

4

허용되는 답변은 정확하지만 일반적으로 수행하려는 작업은 다음과 같습니다.

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

이것은 당신에게 베어지만 기능적인 bash를 제공합니다 (비 대화식 모드로 로그인 할 때와 동일). 예를 들어 언어, 시간대, HOME 등을 설정합니다.


env -iclears 때문에 제대로 작동하지 않습니다. 즉 HOME, 등을 bash -l찾을 수 없습니다 .bash_profile. 새로 로그인 할 때와 같은 쉘을 원한다면 HOME먼저 추가 간접 설정이 필요합니다 .
엘리엇 학살


1

여기에 대부분의 답변이있는 문제는 env -i지워 HOME지므로 bash -l내부에서 실행하더라도 .bash_profile등을 읽지 못합니다 . 찾고있는 것이 새로 로그인 한 것처럼 행동하는 쉘이라면 대신에 이것을 원할 것입니다 :

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

예:

$ 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
로그인 참고 bash쉘이 실행됩니다 .bash_login.bash_profile. 깨끗한 환경을 얻으려면을 사용 --noprofile하거나 HOME해당 파일이없는 디렉토리로 설정 하십시오. 나는 그것이 당신이 "깨끗한"의 의미에 달려 있다고 생각합니다.
Kusalananda

1
예, 문자 그대로 아무것도 포함하지 않은 쉘을 원하면 원래 답변을 따르고 수행하십시오 env -i bash -c .... 이 대답은 특히 컴퓨터에서 새로 로그인 한 것처럼 보이는 쉘을 원할 때입니다.
엘리엇 학살

0

balki의 의견에 답하고 프로세스에서 내 자신의 질문에 대답하려면 :-) :

% 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."

CentOS 7.6의 shebang 라인에서이 작업을 시도하면 env에서이 오류가 발생합니다./usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

긴 인수를 사용하도록 스크립트를 변경하면 --ignore-environment다음과 같은 결과를 얻습니다./usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.
ScottJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.