如何在不重新定义的情况下修改 bash 中的变量命令?

How to modify a variable command in bash without redefining it?

提问人:Shaun Han 提问时间:10/27/2023 最后编辑:Shaun Han 更新时间:10/27/2023 访问量:46

问:

假设我有一个变量命令,它被定义为类似$EXPORT

EXPORT=$(eval "export PYTHONPATH=/path/to/package1:$PYTHONPATH")

但是,我希望该命令将新的 package2 而不是 package1 导出到 。请注意,我想通过修改当前的 $EXPORT 变量而不是重新定义它来做到这一点。我尝试的是将字符串替换为:$PYTHONPATH"/path/to/package1""/path/to/package2"

echo ${$EXPORT//"/path/to/package1"/"/path/to/package2"}

但我收到“糟糕的替换”错误。

那么在 bash 中修改变量命令的正确方法是什么呢?

字符串 bash shell 变量

评论

2赞 Barmar 10/27/2023
export不打印任何内容。你认为你要分配给什么?$EXPORT
0赞 Barmar 10/27/2023
我怀疑你的意思是然后EXPORT='export "PYTHONPATH=/path/to/package1:$PYTHONPATH"eval "$EXPORT"'
0赞 Barmar 10/27/2023
您需要对 和 中的字符进行转义//path/to/package1/path/to/package2
0赞 Shaun Han 10/27/2023
@Barmar好吧,也许这是一个坏例子。最简单的例子是,然后如果我想父目录而不是当前目录,如果我这样做,我仍然会得到.mycmd=$(eval "ls ./")lsecho ${$mycmd//".\/"/"..\/"}bad substitution
1赞 JNevill 10/27/2023
一旦你在系统上按回车键,就会运行:并返回输出,这将是当前目录的内容。这就是将存储在 中的全部内容,您不能再这样做了,因为 eval 已经发生了。您可以将字符串文字存储在名为 and then 的变量中,然后再次更改 and 并获得不同的输出。我认为你是在倒过来想这个问题。mycmd=$(eval "ls ./")eval "ls ./"mycmdeval"ls ./"mycmdeval $mycmd$mycmdeval $mycmd

答:

2赞 Ed Morton 10/27/2023 #1

不要将代码存储在变量中,变量用于存储数据,函数用于存储代码。请参见 https://mywiki.wooledge.org/BashFAQ/050

我想你可能想要这个(未经测试):

do_export() { export PYTHONPATH="${1:-/path/to/package1}:$PYTHONPATH"; }

mycmd() { ls "${1:-./}"; )

然后,您将将其作为 prepend 而不是 to 运行,例如在父目录上运行。do_export '/path/to/package2'package2package1PYTHONPATHmycmd ..ls