测试命令:可读测试失败

测试命令:可读测试失败

我的主目录中有一个文件夹和一个文件,其结构如下:~/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 -rFILE如果存在并且根据授予读取权限,则 返回 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 本身执行的而不是由其单独的内置命令执行。

解决这个问题的一种方法可能是通过evalAlator 所展示的方式,或者可以使用参数替换(从技术上讲,这只是手动做同样的事情):

~$ 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"

相关内容