我正在尝试使用/ 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来完成这项工作?
变量是为子进程导出的,父进程环境不能被子进程改变所以连续命令(分叉子进程看不到从前面命令导出的变量),有些命令是特别的,因为不要分叉新进程但是要运行在当前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\""