Unix: почему моя ошибка не срабатывает? - PullRequest
0 голосов
/ 13 декабря 2010

В filelist, Update, filelist - это файл

hello/noReadPermissions1.txt
hello/noReadPermissions2.txt
hello/noReadPermissions3.txt

файл не имеет разрешения на чтение -w------, однако в каталоге 700, но я пытаюсь прочитать файл.*

while read line; do
[ ! -r "$line" ] && echo "Cannot Read this"
done < filelist

Это не срабатывает!Я не понимаю почему, моя единственная догадка: команда test запускается в другом процессе.Если да, то как обходится?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2010

Одно из возможных объяснений того, почему ваша ошибка не сработает, это если вы работаете от имени пользователя 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

Из этого вы можете видеть, что файл тестируется как «читаемый», даже если для файла не задано разрешение на чтение.

0 голосов
/ 13 декабря 2010

Команда test не выполняется в подоболочке и выдаст вывод, который можно увидеть, даже если бы он был.Не совсем понятно, что ты делаешь.Я полагаю, что вы делаете одну из этих двух вещей:

$ 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

Какая часть этого не работает для вас или не работает должным образом?

0 голосов
/ 13 декабря 2010

На самом деле, это работает для меня в bash:

while read line; do [ ! -r "$line" ] && echo "no file" ; done

дает мне имя файла в качестве вывода, если файл существует и доступен для чтения, и "нет файла", если нет.

Вы используете 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

Вы никогда не получите свое сообщение об ошибке, потому что до того, как запускается просмотр, оболочка обнаруживает, что не может прочитать файл.Вызов open(2) завершается неудачно, и вся строка заканчивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...