在管道中调用我的函数时未设置环境变量

安德鲁

我具有以下递归函数来设置环境变量:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过函数的管道重定向回显时未设置环境变量

来自分类Dev

批处理脚本-使用管道时未设置环境变量

来自分类Dev

通过shell登录时未设置Docker环境变量

来自分类Dev

术语环境变量未设置

来自分类Linux

未设置TERM环境变量

来自分类Dev

GOPATH环境变量未设置

来自分类Dev

未设置 AWS ECS 环境变量

来自分类Dev

Makefile未设置GOOS环境变量

来自分类Dev

eclipse“未设置TERM环境变量”

来自分类Dev

未设置Openshift MYSQL环境变量

来自分类Dev

未设置环境变量,来自Netbeans

来自分类Dev

在Linux中通过管道设置和使用环境变量

来自分类Dev

在脚本化管道中设置环境变量

来自分类Dev

在管道作业中设置每个节点的环境变量

来自分类Dev

在python中设置调用bash脚本的环境变量

来自分类Dev

如何获取/获取 Jenkins 管道中设置的环境变量到我们的 maven pom.xml

来自分类Dev

cloudbuild.yaml文件中的env步骤参数未设置环境变量

来自分类Dev

使用/ bin / ip命令在cronjob中未设置插值环境变量

来自分类Dev

在挂接脚本中未设置dpkg环境变量DPKG_HOOK_ACTION

来自分类Dev

Expo React Native 项目的 Axios 配置中未设置环境变量

来自分类Dev

Jenkins管道中的环境变量

来自分类Dev

配置 Vagrant 时在 sudo 中设置环境变量

来自分类Dev

在 .bashrc 文件中设置环境变量时出错

来自分类Dev

为什么未设置此环境变量?

来自分类Dev

Intellij错误:未设置环境变量名称

来自分类Dev

恢复先前的值或未设置环境变量

来自分类Dev

未设置与空 LESS 环境变量的不同行为?

来自分类Dev

Node.js未设置环境变量

来自分类Dev

C#网站未加载:未设置环境变量

Related 相关文章

热门标签

归档