如果我这样做:
ls ~/Dev/Project/Assets/_Core/
我得到一个超级duper目录列表!好极了!但如果我这样做:
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答案中添加了;寻找问题).
它也没有解决〜处于非领先位置,不应该扩展.要处理两个极端情况,我要去self-plagarize a bit:
expandpath() { local path local -a pathelements resultpathelements IFS=':' read -r -a pathelements <<<"$1" : "${pathelements[@]}" for path in "${pathelements[@]}"; do : "$path" case $path in "~+"/*) path=$PWD/${path#"~+/"} ;; "~-"/*) path=$OLDPWD/${path#"~-/"} ;; "~"/*) path=$HOME/${path#"~/"} ;; "~"*) username=${path%%/*} username=${username#"~"} IFS=: read _ _ _ _ _ homedir _ < <(getent passwd "$username") if [[ $path = */* ]]; then path=${homedir}/${path#*/} else path=$homedir fi ;; esac resultpathelements+=( "$path" ) done local result printf -v result '%s:' "${resultpathelements[@]}" printf '%s\n' "${result%:}" }
…然后:
assetsPath=$(expandpath "$assetsPath")
原文地址:https://www.jb51.cc/bash/387061.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。