我有一個腳本成功地運行此命令。我在另一個腳本中使用這個命令,這個腳本給我錯誤(.md5: Permission denied
)。管道命令與sudo
我正在使用sudo運行上一個腳本。
for i in ${NAME}*
do
sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
我有一個腳本成功地運行此命令。我在另一個腳本中使用這個命令,這個腳本給我錯誤(.md5: Permission denied
)。管道命令與sudo
我正在使用sudo運行上一個腳本。
for i in ${NAME}*
do
sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
所以你想要重定向輸出爲根。使用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
。
您將sudo md5sum $i
的輸出傳輸到未作爲根運行的sed。 sudo甚至不知道這個sed存在。
但這不是問題,因爲sed不需要root權限。問題是> ${NAME}...
。這將sed的輸出重定向到具有該名稱的文件。但重定向實際上是由作爲用戶運行的shell執行的。並且因爲>
是一個shell內置運算符,所以不能用sudo加前綴。
簡單的解決方案是使用tee
。 tee
是一個程序(所以你可以用sudo來運行它),它把它的輸入寫入標準輸出,也寫入一個文件(比如T管,因此名字)。 所以你可以:
for i in ${NAME}*
do
md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done
注意這也將轉儲全部哈希到您的標準輸出。
我用上面的命令得到一個錯誤((sed:-e表達式#1,字符0:沒有以前的正則表達式)) – Sherry
@Sherry看起來像一個完全不相關的問題。例如,如果'$ i'的值爲空,就會發生這種情況。在'md5sum ...'行之前添加一個'echo'i = $ i''行,並確保該值是正確的 – janos