Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将/bin/bash-l-c与串联命令一起使用不会传递环境变量_Bash - Fatal编程技术网

将/bin/bash-l-c与串联命令一起使用不会传递环境变量

将/bin/bash-l-c与串联命令一起使用不会传递环境变量,bash,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 $

我尝试使用/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
是内置的,有关内置
manbash
/^shell内置
的更多信息

否则,将在命令解析期间执行扩展:

/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"'


变量是为子进程导出的,子进程不能更改父进程环境,因此连续的命令(分叉子进程看不到从前面的命令导出的变量),有些命令是特殊的,因为它们不派生新进程,而是在当前shell进程内运行它们是内置命令只有内置命令可以更改当前进程环境
export
是内置的,有关内置
manbash
/^shell内置
的更多信息

否则,将在命令解析期间执行扩展:

/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"'


bash-c
启动子shell(一个子进程),一旦它被终止,设置的值不会反映在父shell中?虽然
export MYVAR=“MYVAR”&&echo$MYVAR
在您创建子进程的同一个shell中运行,但这对父shell没有影响,当bash命令完成时,env将丢失,而export仅限于子进程。看一下在当前进程中运行的“source”命令(别名(.))。我知道将创建一个子shell,但第二个命令(在&&&之后)应该在同一个子shell中执行,不是吗?或者&&sequence中的每个命令都在其自己的子shell中运行—我没有料到这一点。在我的示例中,这两个命令都在同一个-c选项下。
bash-c
启动子shell(子进程),一旦它被终止,设置的值就不会反映在父shell中?虽然
export MYVAR=“MYVAR”&&echo$MYVAR
在您创建子进程的同一个shell中运行,但这对父shell没有影响,当bash命令完成时,env将丢失,而export仅限于子进程。看一下在当前进程中运行的“source”命令(别名(.))。我知道将创建一个子shell,但第二个命令(在&&&之后)应该在同一个子shell中执行,不是吗?或者&&sequence中的每个命令都在其自己的子shell中运行—我没有料到这一点。在我的示例中,这两个命令都在相同的-c选项下。谢谢!这确实是问题所在!谢谢这确实是问题所在!