2011-04-26 11 views
4

我有一個巨大的shell腳本,我正在排除故障。我經常使用sudo從我的主目錄運行腳本。每當執行find,我看到這個錯誤:查找正在返回「find:。:Permission denied」,但我不搜索

find: .: Permission denied

這是事實,根本沒有進入我的家目錄(這是上述錯誤的當前工作目錄或.),但我我不會要求find在我的主目錄中執行任何操作,而寧願讓它完全獨立。

要真正推動點回家,我跑了這一點:

sudo find /dev -maxdepth 1 -type f

,仍然得到同樣的錯誤。如果刪除了-type -f,則錯誤會附加到預期結果的末尾。當然,如果我cd /dev沒有錯誤..可能因爲root可以訪問/dev。儘管我不認爲這是造成問題,但它使腳本看起來有問題。我怎樣才能防止腳本顯示這些錯誤?

+0

如果'sudo find'命令指定'root'*應該*能夠訪問您的主目錄:這就是'root'的含義。 – pavium 2011-04-26 14:19:49

+1

@pavium除非主目錄是用'root_squash'選項(默認)通過NFS掛載的。 – Bolo 2011-04-26 14:31:48

+0

@Bolo是正確的。主目錄是外部安裝的。 'root'沒有權限。 – User1 2011-04-26 14:32:00

回答

13

我跑:

strace find /dev -maxdepth 1 

在GNU/Linux(Ubuntu的),它原來是find使用fchdir系統調用來遍歷目錄樹和最終執行fchdir回到原來的工作目錄。這裏有一個片段:

open(".", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) = 4 
fchdir(4)        = 0 

... irrelevant ... 

write(1, "/dev\n", 5)     = 5 
open("/dev", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 5 
fcntl64(5, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
fchdir(5)        = 0 

... potentially more fchdirs ... 

fchdir(4)        = 0 
close(4)        = 0 

我的暗示? cd /tmp(或其他完全可訪問的目錄),然後運行find

+1

感謝您的幫助。我希望有某種切換來關閉這種行爲。 – User1 2011-04-27 14:38:09

0

嘗試重定向stderr。例如,你可以把它扔掉:

find /dev 2>/dev/null 
+0

感謝您的建議。我仍然希望看到stderr的輸出。 – User1 2011-04-26 14:30:25

2

添加cd /到腳本的開始。除非你source它,腳本運行在一個子外殼,所以你自己的$PWD將不會改變。如果您做了源代碼,那麼可以在開始時存儲$PWD,最後存儲cd -- "$PWD",或者如果您在腳本中沒有執行任何其他cd s,則可以存儲。