2016-10-27 26 views
3

我有一個腳本成功地運行此命令。我在另一個腳本中使用這個命令,這個腳本給我錯誤(.md5: Permission denied)。管道命令與sudo

我正在使用sudo運行上一個腳本。

for i in ${NAME}* 
do 
    sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/} 
done 

回答

4

所以你想要重定向輸出爲根。使用sudo執行命令並不重要,因爲重定向不是執行的一部分,所以它不是由命令的執行用戶執行,而是由當前用戶執行。

常見的伎倆是使用tee

for i in ${NAME}* 
do 
    md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/} 
done 

注:我從md5sum扔下sudo,因爲很可能你並不需要它。

注意:tee在兩個方向輸出:指定的文件和標準輸出。如果你想壓制標準輸出,將其重定向到/dev/null

+0

我用上面的命令得到一個錯誤((sed:-e表達式#1,字符0:沒有以前的正則表達式)) – Sherry

+1

@Sherry看起來像一個完全不相關的問題。例如,如果'$ i'的值爲空,就會發生這種情況。在'md5sum ...'行之前添加一個'echo'i = $ i''行,並確保該值是正確的 – janos

0

您將sudo md5sum $i的輸出傳輸到未作爲根運行的sed。 sudo甚至不知道這個sed存在。

但這不是問題,因爲sed不需要root權限。問題是> ${NAME}...。這將sed的輸出重定向到具有該名稱的文件。但重定向實際上是由作爲用戶運行的shell執行的。並且因爲>是一個shell內置運算符,所以不能用sudo加前綴。

簡單的解決方案是使用teetee是一個程序(所以你可以用sudo來運行它),它把它的輸入寫入標準輸出,也寫入一個文件(比如T管,因此名字)。 所以你可以:

for i in ${NAME}* 
do 
    md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/} 
done 

注意這也將轉儲全部哈希到您的標準輸出。