誰能給我這個問題一個合理的解釋:
我無法運行此命令:
sudo cp /data/*20150522* /backup/
cp: cannot stat `/data/*20150522*': No such file or directory
當我切換到 root 時,它的工作沒有問題。
我確信它是關於擁有正確的權限來列出 /data 目錄中的文件,這些文件具有以下訪問權限:
drwxrwx--- 1 root root
但這裡我用 sudo 運行指令,那這裡有什麼問題呢?
答案1
shell 在將擴展結果傳遞給 之前嘗試擴展 glob 模式cp
(實際上,它將結果傳遞給,sudo
然後將其原封不動地傳遞給cp
)。由於 shell(它以您的身份運行,而不是以 root 身份運行)無法遍歷該目錄,因此cp
最終會在其參數列表中收到未展開的模式。
cp
本身不執行任何全域擴展。它需要一個文件名列表。包含模式的字串不命名檔案。
也許執行該任務最直接的方法是在子 shell 中呼叫命令。使用雙引號 ( "
) 或單引號 ( )引用指令'
。
sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'
這是有效的,因為子 shell 在呼叫命令之前擴展了命令字串中的 glob 模式。由於子 shell 是以 root 身分運行的sudo
,因此擴展成功。
使用雙引號將命令引用到子 shell 允許父 shell 在呼叫命令之前擴展 shell 變數sudo
。如果您希望子 shell 擴展變量,則應使用單引號。在這種情況下,它是等效的,因為您沒有任何變數。但是,您可以添加一個來查看行為上的差異。
sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'
第一個命令將顯示您的用戶名,而第二個命令將顯示 root 用戶名。