Неможливо розширити зірочку без належного дозволу


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

Відповіді:


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додаткову інформацію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.