2016-12-15 90 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)。