变量展开经echo正常但直接执行失败的原因咨询
问题原因分析与解决办法
这问题我之前排查过好几次,核心原因是shell对~的展开规则限制!
为什么会失败?
当你在variables.sh里给rse赋值为~/uncwe/internal_software/rse.sh时,shell并不会把~自动解析成你的家目录路径(比如/home/yourname),而是把~作为普通字符存在变量里了。
- 当你执行
echo ${rse}时,终端只是原样输出变量内容,看起来像是正确路径,但实际上这个~并没有被解析成实际的目录; - 当你直接敲
~/uncwe/internal_software/rse.sh时,shell会先执行~的展开逻辑,替换成家目录再找文件,所以能正常运行; - 但执行
${rse}时,shell只会直接把变量内容当作命令路径,不会二次解析里面的~,相当于它在找一个字面名为~的目录下的文件,自然会提示“No such file or directory”。
解决办法(按推荐程度排序)
用
$HOME代替~赋值(最稳妥)
修改variables.sh里的赋值语句为:rse="$HOME/uncwe/internal_software/rse.sh"$HOME在赋值时会被shell直接展开成你的家目录绝对路径,source后变量里存的就是完整的可直接执行的路径。执行时强制展开
~(慎用)
如果不想修改变量赋值,可以用eval命令强制shell重新解析变量内容:eval "${rse}"注意:如果变量内容来自不可信来源,
eval可能会带来安全风险,所以优先推荐第一种方法。赋值时提前展开
~
也可以在赋值时通过命令替换让~提前展开:rse=$(echo ~/uncwe/internal_software/rse.sh)效果和用
$HOME类似,但可读性稍差。
验证方法
修改完variables.sh后,重新source:
source ~/uncwe/configurations/variables.sh
然后执行echo "${rse}",如果输出的是类似/home/arcticooling/uncwe/internal_software/rse.sh的绝对路径,再运行${rse}就应该正常了。
另外可以排查下变量是否有隐藏字符:用cat -A ~/uncwe/configurations/variables.sh查看赋值行,确认没有多余的空格、换行或不可见字符。
内容的提问来源于stack exchange,提问作者Arcticooling
相关产品推荐
相关产品推荐

