我有一个BASH脚本,正在我的主目录中查找隐藏文件。当我在尝试查找文件时指定绝对路径/home/user/.foo
时,脚本将找到它,但如果我使用~/.foo
,则脚本无法找到该文件。有人可以解释为什么会发生这种情况以及我能找到该文件的其他方式。我希望能够在不同用户的主目录中找到该文件,而不仅仅是我自己的文件。
很抱歉没有提供代码片段,但这里是
file="~/.foo"
[ -f $file ] && echo "foo exists!"
然而这可行
file="home/user/.foo"
[ -f $file ] && echo "foo exists!"
答案 0 :(得分:5)
这是因为当代字号是单词中的第一个未引用字符时,shell仅执行代字号扩展。在
file="~/.foo"
波浪号用双引号引用,因此保持未展开状态。最佳做法是,当代字号应扩展到您的主目录时,始终使用$HOME
(而不是~user
中的其他用户。
来自POSIX的直接涂料:
2.6.1 Tilde扩展
A"代字号前缀"由不带引号的< tilde>组成。在...的性格 一个单词的开头,后面是所有字符 第一个未引用的<斜杠>在单词中,或单词中的所有字符 如果没有<斜杠>。在赋值中(参见XBD变量 赋值),可以使用多个波浪号前缀:在开头 单词(即,在作业的<等号>之后), 跟随任何未加引号的<冒号>或两者。一个波浪号前缀 赋值由第一个未引用的<冒号>终止或者<斜杠>。如果 没有引用tilde-prefix中的字符,字符 在< tilde>之后的波浪号前缀中被视为可能 用户数据库中的登录名。便携式登录名不能 包含在描述中给出的集合之外的字符 XBD其他环境变量中的
LOGNAME
环境变量。如果 登录名为null(即,tilde-prefix仅包含 代字号),代字号前缀由变量的值代替HOME
。如果未设置HOME
,则结果未指定。否则, tilde-prefix应替换为初始工作的路径名 与使用getpwnam()
获取的登录名关联的目录 功能在POSIX.1-2008的系统接口卷中定义。 如果系统无法识别登录名,则结果为 未定义。波浪扩展产生的路径名应视为 引用以防止它被字段拆分和路径名改变 扩展
答案 1 :(得分:2)
始终提供不起作用的代码。从您的描述中无法再现:
$ ls ~/.foo
/home/user/.foo
根据anishsane的建议,可能会有引号。
$ ls "~/.foo"
ls: cannot access ~/.foo: No such file or directory
但如何处理空白区?把〜放在引号之外:
$ ls ~/".f o o"
/home/user/.f o o
但是,除了引号外/外,否则〜不会扩展
$ ls ~"/.f o o"
ls: cannot access ~/.f o o: No such file or directory