3 回答
TA贡献1982条经验 获得超2个赞
您可以使用"${user_defined_directory/#~/$HOME}"
当前用户的主目录替换字符串开头的“〜”。请注意,这不会处理~username/subdir
格式,只能处理纯格式~
。如果需要处理更复杂的版本,则需要编写一个更复杂的转换器。
TA贡献1866条经验 获得超5个赞
在给出一些相当合理的假设的情况下,此方法有效,但它远非显而易见的代码(而且也不是单行代码):
# Working function - painful, but can you simplify any of it?
# NB: Assumes that ~user does not expand to a name with double spaces or
# tabs or newlines, etc.
expand_tilde()
{
case "$1" in
(\~) echo "$HOME";;
(\~/*) echo "$HOME/${1#\~/}";;
(\~[^/]*/*) local user=$(eval echo ${1%%/*})
echo "$user/${1#*/}";;
(\~[^/]*) eval echo ${1};;
(*) echo "$1";;
esac
}
# Test cases
name1="~/Documents/over enthusiastic"
name2="~crl/Documents/double spaced"
name3="/work/whiffle/two spaces are better than one"
expand_tilde "$name1"
expand_tilde "$name2"
expand_tilde "$name3"
expand_tilde "~"
expand_tilde "~/"
expand_tilde "~crl"
expand_tilde "~crl/"
# This is illustrative of the 'normal use' of expand_tilde function
x=$(expand_tilde "$name1")
echo "x=[$x]"
在我的机器(有一个用户crl)上运行时,输出为:
/Users/jleffler/Documents/over enthusiastic
/Users/crl/Documents/double spaced
/work/whiffle/two spaces are better than one
/Users/jleffler
/Users/jleffler/
/Users/crl
/Users/crl/
x=[/Users/jleffler/Documents/over enthusiastic]
该功能分别tilde_expansion处理不同情况。第一个子句处理一个值~并简单地替换$HOME。第二种情况是偏执狂:~/映射到$HOME/。第三个处理~/anything(包括一个空的“任何东西”)。下一种情况处理~user。包罗万象*处理其他所有问题。
请注意,该代码做出了(合理的)假设,即~user不会扩展为包含任何双精度空格,任何制表符或换行符(以及可能还有其他类似空格的字符)的值。如果您必须解决这个问题,生活将是地狱。
请注意chdir()主目录的答案,该答案说明POSIX需要~扩展为当前值$HOME,但~user必须从密码数据库扩展为主目录的值。
TA贡献1817条经验 获得超6个赞
提尔德(Tilde)绝对不会在报价内扩展。可能还有其他bash技巧,但是在这种情况下,我要做的是:
find ~/"$user_defined_directory" -type f
即,将~/引号外的引号移开,并将其余路径保留在引号中。
添加回答
举报