我的主目录中有一个文件夹和一个文件,其结构如下:~/folder/file
。
文件夹和文件对我来说都具有完全权限(文件夹是 700,文件是 600)。以下测试命令(如果重要的话,它位于 shell 脚本中)意外地返回(imo)false。
[ -r ~/folder/file ]
echo $? #Prints 1->Failure
但是如果我使用文件的其他路径,例如
pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success
我是否遗漏了什么?
test -r
FILE
如果存在并且根据授予读取权限,则 返回 true man test
。
答案1
我终于找到了我的问题。问题是我从键盘读取路径(读取命令),但不知何故波浪号(〜)没有扩展。解决方法是:
echo 'Give path:'
read var1
var2=$(eval echo "$var1");
现在 var2 包含完整路径(扩展 ~),之后我就可以正常使用我的测试了。
答案2
为补充Alator 的回答, 应当指出的是波浪号扩展仅在以下情况下执行:
- 变量赋值,
~
紧接着不带引号:
,例如mypath=~/Documents:~/usr/share/stuff
- 变量赋值跟在第一个后面
=
,~
不带引号,例如foo=~/bar
- “单词”的开头:
~/ascript.sh
- 单独的“词”:
stat ~/afile.txt
read
从中获取字符的文字序列stdin
并且不执行波浪号扩展;更重要的是波浪号扩展是由 shell 本身执行的而不是由其单独的内置命令执行。
解决这个问题的一种方法可能是通过eval
Alator 所展示的方式,或者可以使用参数替换(从技术上讲,这只是手动做同样的事情):
~$ echo "${foo/\~/$HOME}"
/home/username/Documents
或者,如果您不介意启动另一个进程(或者您必须处理那些特定的语言),您可以像这样使用 Python 和 Perl:
python -c 'import sys,os; print os.path.expanduser(sys.argv[1])' "$foo"
perl -e 'print glob qq("$ARGV[0]")' "$foo" "$foo"