Поиск возвращает "find:.: Отказано в доступе", но я не ищу в - PullRequest
4 голосов
/ 26 апреля 2011

У меня огромный сценарий оболочки, который я устраняю. Я часто запускаю скрипт из моего домашнего каталога с sudo. Всякий раз, когда выполняется find, я вижу эту ошибку:

find: .: Permission denied

Это правда, что root не имеет доступа к моему домашнему каталогу (который является текущим рабочим каталогом или . в приведенной выше ошибке), но я не прошу find что-либо сделать в моем домашнем каталоге и предпочел бы, чтобы это оставило это в покое.

Чтобы по-настоящему уловить точку зрения, я запустил это:

sudo find /dev -maxdepth 1 -type f

и все равно получаю ту же ошибку. Если -type -f удалено, ошибка добавляется в конец ожидаемых результатов. Конечно, если я cd /dev, то ошибки нет .. вероятно, так как root имеет доступ к /dev. Несмотря на то, что я не думаю, что это вызывает проблемы, скрипт выглядит глючно. Как я могу предотвратить отображение этих ошибок в скрипте?

Ответы [ 3 ]

14 голосов
/ 26 апреля 2011

Я бегал:

strace find /dev -maxdepth 1

в GNU / Linux (Ubuntu), и получается, что find использует системный вызов fchdir для обхода дерева каталогов и, наконец, выполняет fchdir для возврата к исходному рабочему каталогу. Вот фрагмент кода:

open(".", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) = 4
fchdir(4)                               = 0

... irrelevant ...

write(1, "/dev\n", 5)                   = 5
open("/dev", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 5
fcntl64(5, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
fchdir(5)                               = 0

... potentially more fchdirs ...

fchdir(4)                               = 0
close(4)                                = 0

Мой намек? cd /tmp (или другой полностью доступный каталог) перед запуском find.

3 голосов
/ 26 апреля 2011

Добавьте cd / в начало скрипта. Если вы не source, скрипт запускается в под-оболочке, поэтому ваш $PWD не изменится. Если вы делаете исходный код, либо сохраните $PWD в начале и cd -- "$PWD" в конце, либо просто cd -, если вы не делаете никаких других cd s в сценарии.

0 голосов
/ 26 апреля 2011

Попробуйте перенаправить stderr. Например, вы можете выбросить это:

find /dev 2>/dev/null
...