我想将一些命令附加到$ {HOME} / .bashrc文件。
我制作了一个脚本来完成它。
# file name : setup_bash
bashrc_path="${HOME}/.bashrc"
comment="test"
sudo echo "${comment}" >> "${bashrc_path}"
并按
运行bash setup_bash
导致错误。
setup_bash: line 19: /home/user/.bashrc: Permission denied
第19行是(sudo echo ...)。
接下来我尝试了以下代码,
sudo bash setup_bash
它取得了成功。
它们有什么区别?请教我。
答案 0 :(得分:4)
在命令执行之前,Shell i / o重定向发生。也就是说,当你跑...
sudo echo "some text" >> /some/path
... shell在运行/some/path
命令之前打开echo
进行输入。这意味着i / o重定向不将受sudo
命令的影响(因为重定向在sudo
运行之前发生 )。另一方面,当你跑...
sudo bash setup_bash
...您正在以root用户身份运行整个脚本,这意味着当需要执行i / o重定向时,脚本已作为root
运行并且所以重定向会成功。
答案 1 :(得分:1)
问题在于
sudo echo "${comment}" >> "${bashrc_path}"
shell(STDOUT)重定向(write-append)操作>> "${bashrc_path}"
首先由shell完成,当用户调用用户时,甚至在执行main命令之前就完成了。并且可能是调用用户没有权限打开文件进行写入,因此来自shell的权限被拒绝错误消息;这与命令sudo echo ...
无关,因为该命令即使在那时也没有开始执行。
现在,当您在调用时使用sudo
时,您正在冒充root
(默认),因此重定向 - 写入(追加)操作将会成功,(并且您可能已经猜到了你不会这样做) ;甚至现在需要sudo
前面的echo
。