bash 中的独立子 shell

bash 中的独立子 shell

有没有办法从 bash 脚本调用完全隔离的子 shell?我的意思是,被调用的子 shell 不会有任何从其父级继承的变量。这本质上就是我想要实现的目标

答案1

env -i "$BASH" -c 'your code here'

将启动一个新的解释器在最初空的环境中bash进行解释。your code here

由于它是一个新bash实例,它不会继承别名、位置参数、未导出的变量、函数。

使用env -i它也不会继承导出的变量和函数(由调用定义bash或可能从之前继承)。

它仍然会继承在 fork 和命令执行中保留的一些其他类型的属性,例如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

不同的shell会创建不同的变量;例如 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

相关内容