Impossible de développer l'astérisque sans l'autorisation appropriée


16

Quelqu'un peut-il m'expliquer ce qui suit?

$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31  2012 /temp/sit/build/

$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied

Donc, je ne peux pas utiliser l'astérisque ici. Je l'ai essayé avec une commande sudo et j'obtiens une erreur "no such file" plutôt qu'une "permission refusée" ...

sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory

mais ça marche finalement si je n'utilise pas le *

sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file

Réponses:


20

Le shell qui fait l'expansion du *caractère générique est le shell où vous le tapez. Si le shell a la permission de lire la liste des fichiers dans le répertoire, il se développe /temp/sit/build/*à /temp/sit/build/file, et fonctionne sudoavec les arguments ls, -let /temp/sit/build/file. Si la coquille est incapable de trouver un match pour /temp/sit/build/*(que ce soit parce qu'il n'y a pas de résultats, ou parce que le shell n'a pas la permission de voir les matchs), il laisse le modèle seul, et sudoest appelé avec les arguments ls, -let /temp/sit/build/*.

Puisqu'aucun fichier n'est appelé /temp/sit/build/*, la lscommande se plaint si vous lui passez ce nom. Rappelez-vous que lscela ne développe pas les caractères génériques, c'est le travail du shell.

Si vous souhaitez que l'expansion générique se produise dans un répertoire où vous n'avez pas d'autorisation de lecture, l'expansion doit se produire dans un shell démarré par sudoau lieu du shell qui appelle sudo. sudone démarre pas automatiquement un shell, vous devez le faire explicitement.

sudo sh -c 'ls -l /temp/sit/build/*'

Ici, bien sûr, vous pouvez le faire à la sudo ls -l /temp/sit/build/place, mais cela ne se généralise pas à d'autres modèles.


1

Dans de rares cas, vous devez vérifier que vous n'avez pas désactivé la globalisation de votre shell, ce qui pourrait vous donner No such file or directorylorsque vous essayez de répertorier des fichiers avec des caractères génériques ( *).

Par exemple:

$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file

Vérifiez help setpour plus d'informations.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.