1

Почему это происходит?

$ sudo ls /var/lib/postgresql/9.4/pg_log/
postgresql-2015-03-23_134626.log  postgresql-2015-03-25_000000.log  postgresql-2015-03-25_095920.log
postgresql-2015-03-24_000000.log  postgresql-2015-03-25_095626.log
$ sudo ls /var/lib/postgresql/9.4/pg_log/*
ls: cannot access /var/lib/postgresql/9.4/pg_log/*: No such file or directory

ls /path/to/dir/ показывает файлы, но ls /path/to/dir/* говорит, что файлы не найдены.

Почему это?

2 ответа2

3

Вы столкнулись с проблемой, обсуждаемой в sudo не можете записать в /etc/profile и как добавить файл в sudo? и вопрос, обсуждаемый в разделе Кто имеет дело с * в echo *?  Ваша основная оболочка интерпретирует каждую вводимую вами команду, включая подстановочные знаки (также известные как глобусы или шаблоны имен файлов).  Если вы печатаете

some_command *

оболочка перечисляет файлы в текущем каталоге и передает их команде; например,

some_command black blue brown green orange red white yellow

Что ж, если у вас нет разрешения на чтение /var/lib/postgresql/9.4/pg_log , то ваша оболочка не имеет разрешения перечислять /var/lib/postgresql/9.4/pg_log/* .  Тот факт, что когда команда запускается , она запускается с root , это слишком мало, слишком поздно - к этому времени происходит расширение пути (т. Е. Интерпретация с подстановочными знаками).

Вы можете исправить это с помощью хитрости, обсуждавшейся в первых двух вопросах, на которые я ссылался:

sudo sh -c "ls /var/lib/postgresql/9.4/pg_log/*"

Это запускает привилегированную оболочку.  Привилегированная оболочка может затем расширить * .

1

Подстановочный знак раскрывается оболочкой до запуска sudo. Текущий пользователь не может получить доступ к файлам, поэтому строка передается буквально в sudo а затем в ls . ls не расширяет подстановочные знаки (это обязанность оболочки), поэтому он не может найти файл с именем * .

Защитите подстановочный знак, заключая в кавычки и вызывая корневую оболочку для его расширения:

sudo sh -c 'ls /var/lib/postgresql/9.4/pg_log/*'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .