Bash路径变量使用~生成';没有这样的文件或目录';

Bash路径变量使用~生成';没有这样的文件或目录';,bash,Bash,如果我这样做: ls ~/Dev/Project/Assets/_Core/ assetsPath=$(head -n 1 .config | perl -ne 'print if s/^assets=(.*)/\1/g') echo $assetsPath ls $assetsPath 我得到一个超级复制者目录列表!耶!但如果我这样做: ls ~/Dev/Project/Assets/_Core/ assetsPath=$(head -n 1 .config | perl -ne 'pr

如果我这样做:

ls ~/Dev/Project/Assets/_Core/
assetsPath=$(head -n 1 .config | perl -ne 'print if s/^assets=(.*)/\1/g')
echo $assetsPath
ls $assetsPath
我得到一个超级复制者目录列表!耶!但如果我这样做:

ls ~/Dev/Project/Assets/_Core/
assetsPath=$(head -n 1 .config | perl -ne 'print if s/^assets=(.*)/\1/g')
echo $assetsPath
ls $assetsPath
我得到:

~/Dev/Project/Assets/_Core/ # this was the variable value from the echo
ls: ~/Dev/Project/Assets/_Core/: No such file or directory
我甚至试过使用
${assetsPath}
,但也没用

作为部分解决方案:

assetsPath=${assetsPath//'~'/$HOME}
这没有解决的是
~用户名
扩展;如果您的
assetsPath
使用此选项,那么您需要更多的逻辑(我想我已经在单独的StackOverflow答案中添加了此选项;正在查找问题)


它也不在非前导位置处理
~
,在那里它不应该被扩展。要处理这两种极端情况,我将:


~
展开发生在变量展开之前。你不能把它放在变量里。使用
$HOME
或不要将其放入变量中。啊!在调用ls之前,我应该能够替换变量中的tilde是吗?我不确定我是否理解您的意思。如果希望shell展开变量,则需要避免在变量中包含
~
<代码>~是一种特殊的外壳扩展。例如,请参见
echo~root:~root
的输出,与
echo$HOME:$HOME
的输出进行比较<代码>~通常我觉得应该避免使用。@remus如果[[$assetsPath==*[^/~a-zA-Z0-9]*],除非您添加
,否则此解决方案是不合法的;然后回应“防止坏事发生!!”;出口1;fi
在评估之前。是的,
eval
只是一个“解决方案”,如果您的需求中包含“添加了一个巨大的安全漏洞”(或者按照@thatotherguy的建议仔细验证您传递给它的值,尽管我无法立即评估验证是否足够)。谢谢。好多了。我不需要支持~用户名扩展,所以这样就可以了。啊——找到了我努力做到正确的地方:;把它复制到另一个问题中,@EtanReisner,…这两个问题中的一个因为准确性问题而被删除了,不是吗?@EtanReisner,呃--我在这个问题上留得不够好;再努力一点,结果我也没法让自己安静下来。。。所以我这样做了: