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