输出重定向由调用命令的外壳完成。因此,将所有内容分解为零,这是正在发生的事情*:
shell invokes sudo echo "options drm_kms_helper poll=N"
,它sudo
通过echo "options drm_kms_helper poll=N"
命令行执行命令
sudo要求输入密码,打开超级用户外壳程序并调用echo "options drm_kms_helper poll=N"
,然后运行echo
传递该命令的命令"options drm_kms_helper poll=N"
echo,以root
特权运行,将字符串输出到其标准输出。
echo
命令终止,超级用户外壳退出,sudo
终止
从中调用命令的shell收集输出,并尝试将其重定向到/etc/modprobe.d/local.conf
,该目录只能由root写入。它得到“权限被拒绝”错误。
有关解决此问题的方法,请参见@shantanu答案。
(*)-尽管上述顺序有助于理解命令失败的原因,但实际上事情会有些混乱:原始shell会注意到重定向,并在调用sudo ...
命令之前尝试打开文件进行写入。当打开文件失败时,shell甚至不会调用应该写入文件的命令(感谢@PanosRontogiannis指出了这一点)。
这是一个快速测试:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
在上面的测试中,whoami | tee who.txt
打算创建一个who.txt
包含单词“ root”的文件。但是,当调用外壳程序中的输出重定向失败时,也会丢失“ who.txt”文件,因为未调用命令。
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi