在文件列表中, 更新,文件列表是一个文件
hello/noReadPermissions1.txt
hello/noReadPermissions2.txt
hello/noReadPermissions3.txt
该文件没有读取权限-w------
,但是,目录有700
,但我正在尝试读取该文件。
while read line; do
[ ! -r "$line" ] && echo "Cannot Read this"
done < filelist
它没有触发!我不明白为什么,我的唯一猜测是:测试命令是从另一个进程开始的。如果是这样,那是什么解决方法?
答案 0 :(得分:0)
实际上,它适用于bash:
while read line; do [ ! -r "$line" ] && echo "no file" ; done
如果文件存在且可读,则将文件名作为输出,如果不存在,则为“no file”。
你在使用bash吗?
<强>更新强>
等等,您是否只是想阅读文件的内容?
然后
if [ -r $filelist ]
then
while read line
do
# something with line
done < $filelist
fi
更新2:
好的,所以你有类似
的东西$ touch noreadme
$ chmod a-r noreadme
$ ls -l noreadme
--w------- 1 chasrmartin staff 0 Dec 12 23:16 noreadme
并做
$ while read line; do [ ! -r "$line" ] && echo "no line" ; done < noreadme
并且应该
-bash: noreadme: Permission denied
你永远不会得到你的错误信息,因为在看起来甚至开始之前,shell检测到它无法读取文件。 open(2)
调用失败,整行结束。
答案 1 :(得分:0)
为什么错误不会触发的一个可能的解释是,如果您以root用户身份运行。无论文件的权限如何,您都有权读取文件:
# touch /tmp/foo
# chmod 200 /tmp/foo
# ls -l /tmp/foo
--w------- 1 root root 0 Dec 13 21:03 /tmp/foo
# test -r foo && echo readable
readable
通过此,您可以看到文件测试为“可读”,即使文件没有设置读取权限。
答案 2 :(得分:0)
测试命令没有在子shell中运行,并且会生成您可以看到的输出,即使它是。目前还不完全清楚你在做什么。我相信你正在做这两件事之一:
$ mkdir /tmp/readtest
$ cd /tmp/readtest
$ touch noReadPermission{1,2,3}.txt
$ chmod 200 noReadPermission{1,2,3}.txt
$ ls noReadPermission* > filelist
$ ls -l
-rw------- 1 user group 78 Dec 13 11:57 filelist
--w------- 1 user group 0 Dec 13 11:57 noReadPermissions1.txt
--w------- 1 user group 0 Dec 13 11:57 noReadPermissions2.txt
--w------- 1 user group 0 Dec 13 11:57 noReadPermissions3.txt
$ while read line; do [ ! -r "$line" ] && echo "Cannot Read $line"; done < filelist
Cannot Read noReadPermissions1.txt
Cannot Read noReadPermissions2.txt
Cannot Read noReadPermissions3.txt
$ chmod a-r filelist
$ ls -l
--w------- 1 user group 78 Dec 13 11:57 filelist
--w------- 1 user group 0 Dec 13 11:57 noReadPermissions1.txt
--w------- 1 user group 0 Dec 13 11:57 noReadPermissions2.txt
--w------- 1 user group 0 Dec 13 11:57 noReadPermissions3.txt
$ while read line; do [ ! -r "$line" ] && echo "Cannot Read $line"; done < filelist
-bash: filelist: Permission denied
这部分内容对你不起作用或不按预期工作?