gpt4 book ai didi

Bash 无法回显嵌入变量中的 $(hostname)

转载 作者:行者123 更新时间:2023-11-29 09:34:39 27 4
gpt4 key购买 nike

如果我回显一个包含 $(hostname) 命令的字符串,那么它工作正常。例如,在终端中运行:

echo "http://$(hostname)/main.html"
http://artur/main.html

但是,如果我在尝试使用 echo 打印时从文件中获取该字符串(之前对变量执行 cat),则它不起作用:

$ cat site
http://$(hostname)/main.html
$ mysite=$(cat site)
$ echo $mysite
http://$(hostname)/main.html

我做错了什么?有什么想法吗?

最佳答案

shell 执行变量扩展 并且 shell 执行命令替换 但它不会递归地执行它们:

  1. 变量扩展的结果将不会进行任何进一步的变量扩展命令替换.

  2. 命令替换的结果将不会进行任何进一步的变量扩展命令替换.

这是一件好事,因为如果以递归方式完成,将会出现意想不到的结果和安全问题。

一种解决方案是使用eval。这是一种普遍危险的方法,应视为 a last resort.

安全的解决方案是重新考虑您想要什么。特别是,您希望何时评估 hostname?是否应该在创建 site 文件之前对其进行评估?或者,是否应该在代码最终运行时对其进行评估?后者似乎是您想要的。

如果是这种情况,请考虑这种方法。将 %s 放入您希望主机名所在的 site 文件中:

$ cat site
http://%s/main.html

当你读取site文件时,使用printf替换主机名:

$ mysite=$(printf "$(cat site)" "$(hostname)")
$ echo "$mysite"
http://artur/main.html

对于 bash,上述形式的替代方法是:

$ printf -v mysite "$(< site)" "$HOSTNAME"
$ echo "$mysite"
http://artur/main.html

关于Bash 无法回显嵌入变量中的 $(hostname),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39360485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com