我有一个BASH脚本,正在我的主目录中查找隐藏文件.当我/home/user/.foo在尝试查找文件时指定绝对路径时,脚本将找到它,但如果我使用,~/.foo则脚本无法找到该文件.有人可以解释为什么会发生这种情况以及我能找到该文件的其他方式.我希望能够在不同用户的主目录中找到该文件,而不仅仅是我自己的目录.
很抱歉没有提供代码片段,但现在是
file="~/.foo"
[ -f $file ] && echo "foo exists!"
然而这有效
file="home/user/.foo"
[ -f $file ] && echo "foo exists!"
这是因为当代字号是单词中第一个未引用的字符时,shell仅执行代字号扩展.在
file="~/.foo"
Run Code Online (Sandbox Code Playgroud)
波浪号用双引号引用,因此保持未展开状态.最佳做法是始终使用$HOME当代字号扩展到您的主目录时(而不是像其他用户那样)~user.
来自POSIX的直接涂料:
2.6.1 Tilde扩展
"tilde-prefix"由一个单词开头的未加引号的<tilde>字符组成,后跟单词中第一个未加引号的<slash>之前的所有字符,如果没有则单词中的所有字符<削减>.在赋值(参见XBD变量赋值)中,可以使用多个波浪号前缀:在单词的开头(即,在赋值的<等号>之后),在任何未引用的<冒号>之后,或两者.赋值中的波浪号前缀由第一个未引用的<冒号>或<斜杠>终止.如果没有引用tilde-prefix中的字符,则<tilde>后面的tilde-prefix中的字符将被视为来自用户数据库的可能登录名.
LOGNAMEXBD中的环境变量其他环境变量.如果登录名为null(即,波浪号前缀仅包含波浪号),则波形前缀将替换为变量的值HOME.如果HOME未设置,则结果未指定.否则,tilde-prefix应替换为与使用getpwnam()POSIX.1-2008的系统接口卷中定义的函数获得的登录名相关联的初始工作目录的路径名.如果系统无法识别登录名,则结果未定义.由波浪形扩展产生的路径名应被视为引用,以防止它被字段拆分和路径名扩展改变.