Bash 스크립트에서 완전히 분리된 하위 쉘을 호출하는 방법이 있습니까? 내 말은 호출되는 하위 쉘에는 상위 쉘에서 상속된 변수가 없다는 것입니다. 이것이 본질적으로 내가 달성하고 싶은 것입니다.
답변1
env -i "$BASH" -c 'your code here'
bash
처음에는 비어 있던 환경에서 해석하기 위해 새로운 통역사가 시작됩니다 .your code here
새 인스턴스이므로 bash
별칭, 위치 매개변수, 내보내지 않은 변수, 함수를 상속하지 않습니다.
env -i
내보낸 변수 및 함수(호출에 의해 정의되거나 bash
이전에서 상속될 수 있음) 도 이를 사용하여 상속되지 않습니다.
umask
close-on-exec 플래그 없이 열린 파일 설명자, 제한, 일부 신호 구성(예: trap '' INT
호출자의 a도 SIGINT를 무시하게 함) 과 같이 포크 및 명령 실행 전반에 걸쳐 보존되는 다른 유형의 속성을 계속 상속합니다. ) 호출 수신자에서).
답변2
env
-i
플래그가 있는 명령은 빈 환경을 만듭니다.
% env -i /bin/env
%
이제 bash
변수 세트 자체가 생성되지만 이러한 변수는 상속되지 않습니다 bash
.bash
% env -i /bin/bash -c set
BASH=/bin/bash
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_EXECUTION_STRING=set
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
DIRSTACK=()
EUID=1000
GROUPS=()
HOSTNAME=myhost.local
HOSTTYPE=x86_64
IFS=$' \t\n'
MACHTYPE=x86_64-redhat-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/bin:/usr/bin
PPID=12003
PS4='+ '
PWD=/tmp
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments
SHLVL=1
TERM=dumb
UID=1000
_=/bin/bash
다른 쉘은 ksh93 및 csh와 같은 다른 변수를 생성합니다.
% env -i /bin/ksh -c set
ENV=.sh.ENV
FCEDIT=ed
HISTCMD=0
IFS=$' \t\n'
JOBMAX=0
KSH_VERSION=.sh.version
LINENO=1
MAILCHECK=600
OPTIND=1
PPID=12003
PS2='> '
PS3='#? '
PS4='+ '
PWD=/tmp
RANDOM=12790
SECONDS=0.000
SHELL=/bin/sh
SHLVL=1
TMOUT=0
% env -i /bin/csh -c set
argv ()
cwd /tmp
path (/usr/bin /bin /usr/local/bin)
shell /bin/csh
status 0
% env -i /bin/csh -c setenv
PWD=/tmp