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 sudo
avec les arguments ls
, -l
et /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 sudo
est appelé avec les arguments ls
, -l
et /temp/sit/build/*
.
Puisqu'aucun fichier n'est appelé /temp/sit/build/*
, la ls
commande se plaint si vous lui passez ce nom. Rappelez-vous que ls
cela 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 sudo
au lieu du shell qui appelle sudo
. sudo
ne 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.
Gilles 'SO- arrête d'être méchant'
la source