Невозможно расширить звездочку без соответствующего разрешения

16

Может кто-нибудь объяснить мне следующее?

$ 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

Поэтому я не могу использовать звездочку здесь. Я пробовал это с командой sudo, и я получаю ошибку "нет такого файла", а не "отказано в разрешении" ...

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

но это, наконец, работает, если я не использую *

sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file
imagineerThis
источник

Ответы:

20

Оболочка, которая выполняет расширение *подстановочного знака, является оболочкой, в которой вы ее набираете. Если оболочка имеет разрешения на чтение списка файлов в каталоге, то он расширяется /temp/sit/build/*до /temp/sit/build/file, и работает sudoс аргументами ls, -lи /temp/sit/build/file. Если оболочка не может найти совпадения /temp/sit/build/*(из-за отсутствия совпадений или из-за того, что оболочка не имеет разрешения на просмотр совпадений), она оставляет шаблон в покое и sudoвызывается с аргументами ls, -lи /temp/sit/build/*.

Поскольку файл не вызывается /temp/sit/build/*, lsкоманда жалуется, если вы передаете ему это имя. Напомним, что lsне расширяются подстановочные знаки, это работа оболочки.

Если вы хотите, чтобы расширение подстановочного знака происходило в каталоге, где у вас нет разрешения на чтение, тогда расширение должно происходить в оболочке, которая запускается, sudoа не в оболочке, которая вызывает sudo. sudoне запускает оболочку автоматически, вам нужно сделать это явно.

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

Здесь, конечно, вы можете сделать sudo ls -l /temp/sit/build/вместо этого, но это не распространяется на другие шаблоны.

Жиль "ТАК - перестань быть злым"
источник
1

В некоторых редких случаях вам нужно дважды проверить, что вы не отключили глобализацию для своей оболочки, что может дать вам No such file or directoryпри попытке вывести список файлов с помощью символа подстановки ( *).

Например:

$ 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

Проверьте help setдля получения дополнительной информации.

kenorb
источник