首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能使用变量作为命令的前缀来设置环境变量?

为什么我不能使用变量作为命令的前缀来设置环境变量?
EN

Unix & Linux用户
提问于 2018-12-20 03:27:58
回答 2查看 4.2K关注 0票数 13

通常,可以为命令设置一个环境变量,其前缀如下:

代码语言:javascript
复制
hello=hi bash -c 'echo $hello'

我还知道,我们可以使用一个变量来替换命令调用的任何部分,如下所示:

代码语言:javascript
复制
$ cmd=bash
$ $cmd -c "echo hi" # equivalent to bash -c "echo hi"

我很惊讶地发现,您不能使用变量作为命令的前缀来设置环境变量。测试用例:

代码语言:javascript
复制
$ prefix=hello=hi
$ echo $prefix # prints hello=hi
$ $prefix bash -c 'echo $hello'
hello=hi: command not found

为什么我不能使用变量来设置环境变量?前缀部分是一个特殊的部分吗?我能够让它工作在前面,但我仍然不明白为什么。我使用bash4.4。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-12-20 03:41:23

我怀疑这是序列中吸引你的部分:

非变量赋值或重定向的单词将展开(请参阅Shell展开)。如果扩展后仍然保留任何单词,则将第一个单词视为命令的名称,其余的单词为参数。

这是来自简单命令扩展部分中的巴什参考手册

cmd=bash示例中,没有设置环境变量,bash通过参数展开处理命令行,留下bash -c "echo hi"

prefix=hello=hi示例中,在第一次传递中再次没有变量赋值,因此处理继续进行参数扩展,从而产生第一个字的hello=hi

一旦处理了变量赋值,它们就不会在命令执行期间被重新处理。

请参阅set -x下的处理及其结果:

代码语言:javascript
复制
$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42

为了比eval更安全地将“变量展开”作为“环境变量”进行更改,请考虑瓦詹德雷亚env

代码语言:javascript
复制
prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi

这不是严格意义上的命令行变量赋值,因为我们使用env实用程序的主要函数将环境变量分配给命令,但它实现了相同的目标。在处理命令行期间,扩展$prefix变量,将name=value提供给env,由D14将其传递给bash

票数 15
EN

Unix & Linux用户

发布于 2018-12-20 17:57:04

因为$prefix不是任务。@Jeff有更长的解释

您可以使用一个函数来做类似的事情:

代码语言:javascript
复制
$ prefix() { hello=hi "$@"; }
$ prefix bash -c 'echo "$hello"'
hi

如果您愿意的话,...and甚至可以堆叠这些:

代码语言:javascript
复制
$ foo() { foo=123 "$@"; }
$ bar() { bar=456 "$@"; }
$ foo bar bash -c 'echo "$bar $foo"'
456 123
票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/490057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档