在 Bash 脚本中使用引用路径时扩展波浪号便捷路径?

在 Bash 脚本中使用引用路径时扩展波浪号便捷路径?

我一直使用未硬编码在引号内的路径作为 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

相关内容