我具有以下递归函数来设置环境变量:
function par_set {
PAR=$1
VAL=$2
if [ "" != "$1" ]
then
export ${PAR}=${VAL}
echo ${PAR}=${VAL}
shift
shift
par_set $*
fi
}
如果我自己调用它,它将设置变量并回显到stdout:
$ par_set FN WORKS
FN=WORKS
$ echo "FN = "$FN
FN = WORKS
将stdout重定向到文件也可以:
$ par_set REDIR WORKS > out
cat out
REDIR=WORKS
$ echo "REDIR = "$REDIR
REDIR = WORKS
但是,如果我将stdout传递给另一个命令,则不会设置该变量:
$ par_set PIPE FAILS |sed -e's/FAILS/BARFS/'
PIPE=BARFS
$ echo "PIPE = "$PIPE
PIPE =
为什么管道阻止函数导出变量?有没有一种方法可以解决此问题而无需求助于临时文件或命名管道?
感谢Gilles的工作代码:
par_set $(echo $*|tr '=' ' ') > >(sed -e's/^/ /' >> ${LOG})
这样就可以调用脚本了:
$ . ./script.sh PROCESS_SUB ROCKS PIPELINES=NOGOOD
$ echo $PROCESS_SUB
ROCKS
$ echo $PIPELINES
NOGOOD
$ cat log
7:20140606155622162731431:script.sh:29581:Parse Command Line parameters. Params must be in matched pairs separated by one or more '=' or ' '.
PROCESS_SUB=ROCKS
PIPELINES=NOGOOD
如果对完整代码感兴趣,则可在bitbucket https://bitbucket.org/adalby/monitor-bash上托管的项目。
管道的每个部分(即管道的每一侧)都在单独的进程中运行(称为子外壳,当外壳派生一个子进程来运行脚本的一部分时,称为子外壳)。在中par_set PIPE FAILS |sed -e's/FAILS/BARFS/'
,该PIPE
变量是在执行管道左侧的子过程中设置的。此更改未反映在父流程中(环境变量不在流程之间转移,它们仅由子流程继承。
管道的左侧始终在子外壳中运行。一些外壳程序(ATT ksh,zsh)在父外壳程序的右侧运行;大多数还在子外壳程序的右侧运行。
如果要重定向脚本的一部分的输出并在ksh / bash / zsh的父shell中运行该部分,则可以使用进程替换。
par_set PROCESS SUBSTITUTION > >(sed s/ION/ED/)
使用任何POSIX Shell,都可以将输出重定向到命名管道。
mkfifo f
<f grep NAMED= &
par_set NAMED PIPE >f
哦,您丢失了变量替换的引号,因此代码在上中断了par_set name 'value with spaces' star '*'
。
export "${PAR}=${VAL}"
…
par_set "$@"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句