![在 Bash 脚本中使用引用路径时扩展波浪号便捷路径?](https://linux22.com/image/1439432/%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%BC%95%E7%94%A8%E8%B7%AF%E5%BE%84%E6%97%B6%E6%89%A9%E5%B1%95%E6%B3%A2%E6%B5%AA%E5%8F%B7%E4%BE%BF%E6%8D%B7%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
我一直使用未硬编码在引号内的路径作为 bash 脚本的路径。这样,如果路径(用户输入、用户主目录等)恰好包含奇怪的字符、空格或破折号,我的脚本就不会受到干扰并照常继续运行。
但我刚刚注意到,虽然它适用于大多数路径,但对于以波浪号作为用户主目录的快捷方式的路径,它将失败。例如:
# works
install dotfile "/home/user/.dotfile"
# fails
install dotfile "~/.dotfile"
# fails
cp dotfile "~/.dotfile"
引号试图防止解析本身~
。因为它试图将文件复制到./~/.dotfile
我想使用它,~/
因为它很方便(而且简单。简单意味着错误更少),并且用引号括起来,因为它可以安全地抵御空格和破折号。有没有办法同时拥有两者?
答案1
我想使用 ~/,因为它很方便(而且简单。简单意味着错误更少),并将其括在引号中,因为它可以安全地抵御空格和破折号。有没有办法同时使用两者?
是的,使用双引号是一种很好的做法。但不要将它们放在 周围~/
。不要将该部分放在引号中:
install dotfile ~/".dotfile"
波浪符号扩展和复杂的主目录名称
扩展~
使用了HOME
变量。让我们创建一个名字难懂的目录并将其分配给它HOME
,然后看看 shell 的行为:
$ mkdir $'/tmp/spaces and\ttabs'
$ HOME=$'/tmp/spaces and\ttabs'
$ cd ~/
$ pwd
/tmp/spaces and tabs
因此,它能正常工作。
答案2
尝试使用eval
像这样扩展~/
为文件的实际完整路径:
my_path=".dotfile"
eval full_path=$(printf "~/%q" "$my_path")
echo $full_path
或者尝试这个:
eval full_path=$(echo "~/.dotfile")
echo $full_path