使用带有连接命令的/ bin / bash -l -c不会传递环境变量

问题描述 投票:0回答:1

我正在尝试使用/ bin / bash -l -c执行一系列bash命令,如下所示:

/bin/bash -l -c "cmd1 && cmd2 && cmd3..."

我注意到,如果cmd1碰巧导出环境变量,cmd2就看不到它,依此类推。如果我在没有/ bin / bash -l -c选项的情况下运行相同的连接命令,它运行正常。

例如,这不会打印MYVAR的值:

$/bin/bash -l -c "export MYVAR="myvar" && echo $MYVAR"

然而,以下工作符合预期

$export MYVAR="myvar" && echo $MYVAR
myvar

找不到为什么使用/ bin / bash -l -c在这里不起作用?或者有什么建议如何使用/ bin / bash -l -c来完成这项工作?

bash
1个回答
2
投票

变量是为子进程导出的,父进程环境不能被子进程改变所以连续命令(分叉子进程看不到从前面命令导出的变量),有些命令是特别的,因为不要分叉新进程但是要运行在当前shell进程内部,他们是内置命令只有内置命令可以改变当前进程环境export是内置的,有关内置man bash /^shell builtin的更多信息。

否则,在命令解析期间完成扩展:

/bin/bash -l -c "export MYVAR="myvar" && echo $MYVAR"

是一个命令(注意嵌套引号没有按照您的预期执行,因为正在关闭并打开引用的字符串,myvar未被引用并且可能被拆分)。所以$MYVAR在被分配到myvar之前扩展到当前值。

export MYVAR="myvar" && echo $MYVAR

是两个命令和$MYVAR,因为&&是bash语法(不像“&&”那样的文字),在被分配后被扩展。

所以$有字面含义(未扩展)使用单引号或使用反斜杠转义。

/bin/bash -l -c 'export MYVAR="myvar" && echo "$MYVAR"'

要么

/bin/bash -l -c "export MYVAR=\"myvar\" && echo \"\$MYVAR\""
© www.soinside.com 2019 - 2024. All rights reserved.