Кто может дать мне логическое объяснение этому вопросу:
Я не могу выполнить эту команду:
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.