当使用 sudo 命令来运行一个 Linux 命令时, 我们希望这个 Linux 命令能以 root 身份运行, 但有时候都会遇到 "permission denied" 的错误, 结果发现是 Linux 命令中只有部分语句是按 root 用户运行的.
比如, 如果以 root 身份运行下面的命令, 没有任何问题:
$ echo 12000> /proc/sys/vm/dirty_writeback_centisecs
但, 如果这样执行:
$ sudo echo 12000> /proc/sys/vm/dirty_writeback_centisecs
你就会得到 "permission denied" 的错误.
为什么?/bin/echo 是以 root 身份运行的, 因为你使用了 sudo, 但将 echo 的输出结果写入 root 所有的文件时, 仍然是按照你自己的身份运行的, 而不是 root 身份. shell 的执行顺序是先于 sudo 执行了输出重定向.
解决办法是, 使用管道 (pipeline) 将整个命令送给 sudo. 有几种方式可以做到这些, 我最喜欢的一种是:
echo "echo 12000> /proc/sys/vm/dirty_writeback_centisecs" | sudo sh
这样, 不管命令有多复杂, 都可以把它放到 | sudo sh 之前, 这样执行 sudo 命令非常保险, 只是稍微增加了一点复杂度, 但是十分有效的避免了遇到 "permission denied" 这种错误.
来源: http://www.webhek.com/post/running-complex-commands-with-sudo.html