2016-12-15 1411 views
0

我想附加一些命令到$ {HOME} /。bashrc文件。bash文件中sudo bash和sudo命令的区别是什么?

我做了一个脚本来做到这一点。

# 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 

它导致成功。

他们有什么不同?请教我吧。

回答

3

Shell发生I/O重定向之前执行一个命令。也就是说,当你运行...

sudo echo "some text" >> /some/path 

...外壳打开/some/path输入它曾经运行echo命令。这意味着I/O重定向是而不是将受到sudo命令的影响(因为重定向发生在之前sudo甚至运行)。在另一方面,当您运行...

sudo bash setup_bash 

...你正在运行的整个脚本作为根用户,这意味着,当谈到时间来执行I/O重定向脚本已经运行为root,所以重定向会成功。

1

的问题是,在

sudo echo "${comment}" >> "${bashrc_path}" 

壳(STDOUT)重定向(写入 - 追加)操作>> "${bashrc_path}"是由shell先做,为用户调用用户,这是之前的主要就算做完了命令被执行。并且可能调用用户没有权限打开文件进行写入,因此权限拒绝来自shell的错误消息;这与命令sudo echo ...无关,因为即使到那时该命令还没有开始执行。

现在,当你在调用时使用sudo您在假冒root(默认值),所以重定向 - 写(附加)操作将succeeed,(正如你可能已经猜到了,你甚至都不需要sudo前面现在为echo)。