有什么想法如何将环境变量放入dtach
?默认情况下它们似乎不会被继承......
FOO=bar && dtach -c /tmp/a-socket env
# env does not include $FOO
[编辑]
由于原因(TM),我需要在那里有某种命令分隔符。要么是 ;或&&。
(我现在意识到这不是一个特定于 dtach 的问题,它只是反映了我对 shell 的理解很差......)
答案1
其实export
也不需要。export
意思是:
标记每个名称以自动导出到随后执行的命令的环境。如果提供了 VALUE,请在导出之前分配 VALUE。
您可以使用以下命令架构公开环境变量:
FOO=bar dtach -c /tmp/a-socket env
它不会造成副作用下一个子进程(因此执行的命令)将继承FOO=bar
环境变量。
评论您的第一次执行尝试。&&
在配置环境变量和运行进程之间添加运算符是没有意义的。它不运行任何内容(退出代码 == 0
),然后在没有环境变量的情况下运行您的命令。
答案2
在您的示例中,&&
它充当命令分隔符(具体来说,如果第一个命令成功,则仅执行第二个命令)。这可能不是您想要的,请考虑以下示例:
name=value;$command
name=value||$command
name=value&&$command
在所有这三种情况下,名称都被设置为当前 shell 中的值,在第一种和第三种情况下,命令 $command 会被执行,因为赋值永远不会失败,在第二种情况下,$command 不会被执行,因为赋值永远不会失败(带有保留变量的奇怪 shell 中可能存在的异常)。在任何情况下,变量都不会传递给 $command。
name=value;export name;$command
export name=value;$command
省略其他命令分隔符的类似示例,这些示例添加一个导出,将变量传递给 $command 以及此后在当前会话中执行的所有其他命令。
name=value $command
请注意缺少命令分隔符。在这种情况下,变量将传递给 $command 并且仅传递给命令,它不在当前 shell 中使用。
答案3
抱歉,回答我自己的问题:如果您确实必须有一个&&
or;
命令分隔符,那么您别无选择,只能使用export
:
export FOO=bar; dtach -c /tmp/a-socket env
# this time env will show FOO=bar
; unset FOO
如果你不想污染你的主壳,你可以在最后添加一个...