6

Кто может дать мне логичное объяснение этой проблемы:

Я не могу запустить эту команду:

sudo cp /data/*20150522* /backup/

cp: cannot stat `/data/*20150522*': No such file or directory

И когда я переключаюсь на root, он работает без проблем.

Я уверен, что речь идет о наличии правильных привилегий для перечисления файлов в каталоге /data, которые имеют следующие права доступа:

drwxrwx--- 1 root root 

Но здесь я запускаю команду с sudo, так в чем здесь проблема?

1 ответ1

17

Оболочка пытается развернуть шаблон glob, прежде чем передать расширенный результат в cp (фактически, он передает результат в sudo который затем передает его без изменений в cp). Поскольку оболочка (она работает как вы, а не root) не может пройти по каталогу, cp итоге получает нерасширенный шаблон в своем списке аргументов.

cp не выполняет никакого расширения glob. Ожидается список имен файлов. Строка с шаблоном в ней не называет файл.

Возможно, самый простой способ выполнить задачу - вызвать вашу команду в под-оболочке. Заключите команду в кавычки (") или одинарные кавычки (').

sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'

Это работает, потому что вложенная оболочка раскрывает шаблон glob в командной строке перед вызовом команды. Поскольку под-оболочка запускается с правами суперпользователя под sudo , расширение прошло успешно.

Использование двойных кавычек для цитирования команды в под-оболочке позволяет родительской оболочке раскрывать переменные оболочки перед вызовом команды sudo . Если вы хотите, чтобы переменные раскрывались под-оболочкой, вместо них следует использовать одинарные кавычки. В этом случае это эквивалентно, так как у вас нет никаких переменных. Но вы можете добавить один, чтобы увидеть разницу в поведении.

sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'

Первая команда отобразит ваше имя пользователя, а вторая команда отобразит имя пользователя root.

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