用sudopipe道命令

我有一个成功运行此命令的脚本。 我正在使用这个命令在另一个脚本,这给我错误在这一行( .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加前缀。

简单的解决方案是使用teetee是一个程序(所以你可以用sudo来运行它),它把输入写到标准输出中,也写入到一个文件(比如T管,因此名字)。 所以你可以只是:

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

注意这也会将所有哈希转储到标准输出。