為什麼“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

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 用戶名。

相關內容