"~/Desktop/test.txt: 没有这个文件或目录"

36

我已经写了这个脚本:

#!/bin/bash

file="~/Desktop/test.txt"
echo "TESTING" > $file
./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory

我做错了什么?


2个回答

62

尝试用$HOME替换~。只有在波浪号未被引用时才会进行波浪号扩展。请参见info "(bash) Tilde Expansion"

你也可以使用file=~/Desktop而不加引号,但如果你替换其中一部分为某个字段分隔符,则会出现错误。引用变量的值可能是一个养成好习惯的好事情。引用变量file=~/"Desktop"也可以工作,但我认为这样做相当丑陋。

另一个倾向于在可能的情况下选择$HOME的原因:波浪号扩展仅发生在单词开头。因此,如果command本身进行波浪号扩展(这将因命令而异),则command --option=~/foo仅在该命令中起作用,而command --option="$HOME/foo"始终有效。


5
@Mason - 同时,波浪线扩展发生在变量扩展之前,因此当 $file 转换为 ~/Desktop/test.txt 时,你已经错过了波浪线扩展阶段。请参见http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions以了解扩展的顺序。 - Stephen P
谢谢。在我看来,Bash 变量、引号/扩展非常模糊和容易出错:每种引号符(`'")都有不同的含义,并且根据上下文而变化。我想知道一种可以减少这些错误的方法/技巧。 - b.g.

1
FYI,你也可以使用eval
eval "echo "TESTING" > $file"
< p > eval 命令将命令作为参数,导致 shell 执行 Tilde expansion。 < /p >

2
这是一个可怕的解决方法,而且很容易在没有eval的情况下解决问题。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接