我有一个成功运行此命令的脚本。我在另一个脚本中使用此命令,这使我在此行(.md5: Permission denied
)上出错。
我正在使用sudo运行上一个脚本。
for i in ${NAME}*
do
sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
答案 0 :(得分:4)
所以你想以root身份重定向输出。使用sudo
执行命令并不重要,因为重定向不是执行的一部分,因此它不是由命令的执行用户执行的,而是由当前用户执行的。
常见的诀窍是使用tee
:
for i in ${NAME}*
do
md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done
注意:我从sudo
删除了md5sum
,因为您可能不需要它。
注意:tee
在两个方向输出:指定的文件和标准输出。如果要抑制stdout上的输出,请将其重定向到/dev/null
。
答案 1 :(得分:0)
您获取sudo md5sum $i
的输出并将其传递给未以root身份运行的sed。 sudo甚至不知道这个sed存在。
但这不是问题,因为sed不需要root权限。问题是> ${NAME}...
。这会将sed的输出重定向到具有此名称的文件。但重定向实际上是由您的用户运行的shell执行的。因为>
是一个shell内置运算符,所以不能用sudo作为前缀。
简单的解决方案是使用tee
。 tee
是一个程序(所以你可以用sudo运行它),它将它的输入写入标准输出,也写入文件(如T-Pipe,因此名称)。
所以你可以:
for i in ${NAME}*
do
md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done
请注意,这也会将所有哈希值转储到标准输出。