bash 文件中的 sudo bash 和 sudo 命令有啥区别? [复制]

Posted

技术标签:

【中文标题】bash 文件中的 sudo bash 和 sudo 命令有啥区别? [复制]【英文标题】:What is the difference of sudo bash and sudo command in bash file? [duplicate]bash 文件中的 sudo bash 和 sudo 命令有什么区别? [复制] 【发布时间】:2017-04-30 14:23:21 【问题描述】:

我想在 $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

结果是成功。

它们有什么区别?请教我。

【问题讨论】:

【参考方案1】:

Shell i/o 重定向发生在命令执行之前。也就是说,当你运行时...

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

...shell 在运行echo 命令之前打开/some/path 以供输入。这意味着 i/o 重定向不会受到sudo 命令的影响(因为重定向发生在sudo 甚至运行之前)。另一方面,当您运行时...

sudo bash setup_bash

...您正在以 root 用户身份运行 整个脚本,这意味着当需要执行 i/o 重定向时,脚本已经以 root 身份运行,因此重定向会成功。

【讨论】:

【参考方案2】:

问题是在

sudo echo "$comment" >> "$bashrc_path"

shell(STDOUT)重定向(写入-追加)操作>> "$bashrc_path"首先由shell完成,作为用户调用用户,这甚至在执行主命令之前完成。并且大概调用用户无权打开文件进行写入,因此来自 shell 的权限被拒绝错误消息;这与命令 sudo echo ... 无关,因为到那时该命令还没有开始执行。

现在,当您在调用时使用 sudo 时,您正在模拟 root(默认),因此重定向 - 写入(附加)操作将成功,(并且您可能已经猜到您甚至不需要 @ 987654326@ 现在在echo 前面)。

【讨论】:

以上是关于bash 文件中的 sudo bash 和 sudo 命令有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

简化bash脚本,以sudo身份运行时从命令中提取第一个单词

我将如何创建一个文本文件并在 bash [重复] 中使用 sudo 权限填充它

Bash:sudo:找不到命令

在 Bash 中检查 sudo(带有 if 语句的脚本)

Linux下-bash: Permission denied 或者 sudo: command not found 错误

执行 sudo 和 chmod 命令的 bash 脚本无法正常工作