我有一个成功运行此命令的脚本。 我正在使用这个命令在另一个脚本,这给我错误在这一行( .md5: Permission denied
)。
我用sudo运行以前的脚本。
for i in ${NAME}* do sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/} done
所以你想以root身份重定向输出。 使用sudo
执行命令并不重要,因为重定向不是执行的一部分,所以它不是由命令的执行用户执行,而是由当前用户执行。
常用的技巧是使用tee
:
for i in ${NAME}* do md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/} done
注意:我从md5sum
删除了sudo
,因为可能你不需要它。
注意: tee
在两个方向输出:指定的文件和stdout。 如果你想压制标准输出,重定向到/dev/null
。
你把sudo md5sum $i
的输出传给一个不以root身份运行的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
注意这也会将所有哈希转储到标准输出。