2010-12-13 10 views
0

Dans filelist, mise à jour, est un fichier filelistUnix: Pourquoi mon erreur ne se déclenche-t-elle pas?

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

le fichier n'a pas les autorisations de lecture -w------, cependant, le répertoire a 700, mais je suis en train de lire le fichier.

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

Ce n'est pas déclencheur! Je ne comprends pas pourquoi, ma seule et unique supposition est: la commande de test commence dans un autre processus. Si oui, qu'est-ce qu'un travail autour?

Répondre

0

En fait, ça marche pour moi en bash:

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

me donne le nom du fichier en sortie si le fichier existe et est lisible, et « aucun fichier » sinon.

Utilisez-vous bash?

Mise à jour:

Attendez, êtes-vous juste essayer de lire le contenu du fichier?

puis

if [ -r $filelist ] 
then 
    while read line 
    do 
    # something with line 
    done < $filelist 
fi 

Mise à jour 2:

D'accord, vous avez quelque chose comme

$ touch noreadme 
$ chmod a-r noreadme 
$ ls -l noreadme 
--w------- 1 chasrmartin staff 0 Dec 12 23:16 noreadme 

et faire

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

une nd devrait se

-bash: noreadme: Permission denied 

Vous jamais votre message d'erreur, car avant tout regarder même commence, le shell détecte qu'il ne peut pas lire le fichier. L'appel open(2) échoue et la ligne entière est terminée.

+0

C'était en fait un fichier, mon erreur. Je devrais dire que le fichier contient plusieurs lignes. – Strawberry

+0

Votre réponse serait plus facile à lire si au lieu de la traiter comme un journal, vous modifiez votre réponse sur place pour dire ce que vous voulez. – camh

0

Une explication possible de la raison pour laquelle votre erreur ne se déclenchera pas est si vous exécutez en tant que root. Vous aurez la permission de lire le fichier quelles que soient les autorisations sur le fichier:

# 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 

De là, vous pouvez voir que les tests de fichiers comme « lisibles », même si il n'y a pas l'autorisation de lecture défini sur le fichier.

+0

Cela répond à la question comment? –

+0

@Charlie Martin: La question dans le titre est "Pourquoi mon erreur ne déclenche pas?" J'ai répondu que si vous êtes root, vous aurez des permissions, même si ça ne vous ressemble pas. Par conséquent, l'erreur ne se déclenchera pas. Comment puis-je rendre cela plus clair? – camh

0

La commande test ne s'exécute pas dans un sous-shell et produirait une sortie que vous pouvez voir même si elle l'était. Ce n'est pas tout à fait clair ce que vous faites. Je crois que vous faites une de ces deux choses:

$ 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 

Quelle partie de ce qui ne fonctionne pas pour vous ou ne fonctionne pas comme prévu?

Questions connexes