Почему «sudo cp» не может найти файлы?

Почему «sudo cp» не может найти файлы?

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

Я не могу выполнить эту команду:

sudo cp /data/*20150522* /backup/

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

А когда я переключаюсь на root-доступ, всё работает без проблем.

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

drwxrwx--- 1 root root 

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

решение1

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

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

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

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

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

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

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

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

Связанный контент