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

时间:2018-03-01 10:47:33

标签: bash

我尝试使用/ 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?

来完成这项工作

1 个答案:

答案 0 :(得分:2)

变量是为子进程导出的,父进程环境不能通过子进程改变所以连续命令(分支子进程无法看到从前面命令导出的变量),有些命令是特别的,因为没有fork新进程但是在当前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\""