我尝试使用/ 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?
来完成这项工作答案 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\""