我有一个能够成功执行此命令的脚本。但是,当我在另一个脚本中使用此命令时,在此行(.md5: Permission denied
)上出现错误。
我正在使用sudo运行之前的脚本。
for i in ${NAME}*
do
sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
所以您想将输出作为root重定向。由于重定向不是命令执行的一部分,因此它不由命令的执行用户执行,而是由当前用户执行。
常见的技巧是使用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
的输出传输到未以root身份运行的sed中。sudo甚至不知道这个sed的存在。> ${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
$i
的值为空,就会发生这种情况。在md5sum ...
行之前添加一行echo "i=$i"
,并确保该值正确。 - janos