【发布时间】:2016-06-30 14:44:08
【问题描述】:
首先,这是我正在运行的脚本来获取有问题的字符串:
# sed finds all sourced file paths from inputted file.
#
# while reads each match output from sed to $SOURCEFILE variable.
# Each should be a file path, or a variable that represents a file path.
# Any variables found should be expanded to the full path.
#
# echo and calls are used for demonstractive purposes only
# I intend to do something else with the path once it's expanded.
PATH_SOME_SCRIPT="/path/to/bash/script"
while read -r SOURCEFILE; do
echo "$SOURCEFILE"
"$SOURCEFILE"
$SOURCEFILE
done < <(cat $PATH_SOME_SCRIPT | sed -n -e "s/^\(source\|\.\|\$include\) //p")
您可能还希望使用以下内容将其作为模拟数据进行测试:
[ /path/to/bash/script ]
#!/bin/bash
source "$HOME/bash_file"
source "$GLOBAL_VAR_SCRIPT_PATH"
echo "No cow powers here"
对于 tl;dr 工作人员来说,while 循环基本上会在模拟数据上吐出以下内容:
"$HOME/bash_file"
bash: "$HOME/bash_file": no such file or directory
bash: "$HOME/bash_file": no such file or directory
"$GLOBAL_VAR_SCRIPT_PATH"
"$GLOBAL_VAR_SCRIPT_PATH": command not found
"$GLOBAL_VAR_SCRIPT_PATH": command not found
我的问题是,你能否让变量正确展开,例如打印“/home//bash_file”和“/expanded/variable/path”?我还应该声明虽然eval 有效,但我不打算使用它,因为它的potential insecurities。
提示cat | sed 中使用的任何变量值都将在全局范围内可用,包括调用脚本,所以这不是因为脚本无法调用变量值。
第一个解决方案尝试
使用 anubhava 的envsubst 解决方案:
SOMEVARIABLE="/home/nick/.some_path"
while read -r SOURCEFILE; do
echo "$SOURCEFILE"
envsubst <<< "$SOURCEFILE";
done < <(echo -e "\"\$SOMEVARIABLE\"\n\"$HOME/.another_file\"")
这会输出以下内容:
"$SOMEVARIABLE"
""
"/home/nick/.another_file"
"/home/nick/.another_file"
不幸的是,它没有扩展变量!亲爱的:(
第二个解决方案尝试
基于第一次尝试:
export SOMEVARIABLE="/home/nick/.some_path"
while read -r SOURCEFILE; do
echo "$SOURCEFILE"
envsubst <<< "$SOURCEFILE";
done < <(echo -e "\"\$SOMEVARIABLE\"\n\"$HOME/.another_file\"")
unset SOMEVARIABLE
它可以在没有 eval 的情况下产生我们想要的结果,并且不会弄乱全局变量(反正时间太长了),哇!
还建议使用eval(尽管可能不安全)获得好的亚军,这可以在this answer 和here 中找到(链接由anubhava 的扩展cmets 提供)。
【问题讨论】:
-
请注意,如果您在此评论之前阅读此问题,我已更改第三个评论块中的两个输出错误,因为它们不正确 - 道歉!
-
感谢您更新问题,提供所有相关详细信息和建议的链接 +1
标签: bash sed cat variable-expansion