当 shell 作为命令运行外部可执行文件时,我们可以将环境变量传递到可执行文件中。
$ var=3 /bin/echo `$var` $ var=3 bash -c "/bin/echo '$var'"
两者都不输出任何内容。
当程序执行时
exec
,我想看看环境变量是否也起作用:$ bash $ unset var; $ var=3 exec /bin/echo '$var' $var $ exec var=3 /bin/echo '$var' bash: exec: var=3: not found
为了防止变量扩展,我在 周围使用单引号$var
。保护似乎有点过分了。
为什么在上述情况下没有设置这个环境变量?
我可以使环境变量适用于执行的程序exec
吗?
谢谢。
答案1
请记住,参数扩展不会神奇地发生,您需要一个 shell 来为您完成此操作。
var=3 /bin/echo `$var`
我不确定你想用这个做什么,反引号在这里不合适(它们执行命令并被其输出替换)。
var=3 bash -c "/bin/echo '$var'"
不起作用,因为参数扩展发生在赋值之前,因此当前 shell 更改"/bin/echo '$var'"
为/bin/echo ''
(假设var
未定义),并且子 shell 运行
/bin/echo ''
尝试
var=3 bash -c 'echo $var'
相反:这里的单引号保护参数不受当前 shell 的影响,新的 shell 运行时使用
echo $var
它会按照您的预期进行处理。
在你的第二点中,我最初的评论仍然适用。如果您想尝试一下环境并看看会发生什么,请运行env
并过滤其输出:
var=3 env | grep var
var=3 exec env | grep var
答案2
您的所有问题都与引用有关,而不是环境。
- 命令的环境。
当 shell 作为命令运行外部可执行文件时,我们可以将环境变量传递到可执行文件中。
是的,这是一种为命令(外部或其他)设置环境变量的方法。
但是你在这一行中缺少什么[a]:
$ var=3 /bin/echo "$var"
shell 在构建参数时扩展变量,并且,如果
var
启动命令的 shell 中未设置该变量,则实际执行的内容如下:$ var=3 /bin/echo ""
要实际查看当前的 shell 扩展,请运行以下命令:
$ var=RunningShell ; var=3 /bin/echo "$var" RunningShell
延迟变量评估的一种(通常是不安全的)方法是:
$ var=3 eval /bin/echo '"$var"' 3
在第二个示例中,您交换了报价:
$ var=3 bash -c "/bin/echo '$var'"
不打印任何内容,实际命令行变为:
$ var=3 bash -c "/bin/echo ''"
随着(未设置)变量 $var 的值扩展。你的意思可能是这样的:
$ var=thisis3 bash -c '/bin/echo "$var"' thisis3
在这种情况下,单引号会阻止执行 shell 扩展变量,而将扩展留给执行 shell (
bash -c
)。使用 env 来实际查看环境。
- 当程序由 exec 执行时,我想看看环境变量是否也起作用:
不要在当前的 shell 中执行,因为它将关闭正在运行的 shell。
您可以这样做以避免关闭正在运行的 shell:$ var=3 exec /bin/echo \$var | cat $var
由于封闭壳将是无论如何都会关闭的壳,即管道的第一个子壳。
但这不会向您显示 var 在环境中的价值。要查看环境中的变量,请使用命令查看环境:
$ var=3 env | grep var var=3
- 命令的环境。
[a]
您编写的命令有反引号`
,将它们更改为单引号将避免变量扩展并打印$var
.:
$ var=3 /bin/echo '$var'
$var