如何使用Bash在 /etc/profile 中进行写入 | 权限被拒绝

10

我正在创建一个bash脚本来设置Ubuntu 16.04 lts操作系统的下载、安装和其他操作,而不需要逐个输入每个命令。我必须在/etc/profile文件中编写代码以添加PATH环境变量。但是当我的代码执行到这一行时,会出现"Permission Denied"的错误信息。以下是我的代码:

sudo echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
bash: /etc/profile: Permission denied

你知道我该如何解决这个问题吗?

2个回答

22

Shell i/o 重定向在 shell 执行命令之前发生... 换句话说,当你写下:

sudo somecommand >> /etc/profile

>> /etc/profile 这部分是以当前用户身份执行的,而不是 root。这就是为什么您会收到 "权限被拒绝" 的消息。有各种各样的解决方法。您可以运行:

sudo sh -c "echo export PATH=$PATH:/usr/local/go/bin >> /etc/profile"

你也可以利用 tee 命令的追加 (-a) 标志:

echo "export PATH=$PATH:/usr/local/go/bin" | sudo tee -a /etc/profile

2
这里还有另一个问题--由于$PATH被双引号包含,它将被当前shell替换,而不是在配置文件中保留原样。它需要用单引号或转义字符包含(如果使用sh -c选项,则需要用两层引号/转义字符进行保护)。 - Gordon Davisson
太棒了!谢谢你! - Javier Salas
需要使用 export 吗?我在 /etc/profile 中最终得到了单词 "export"。 - dangel
我的意思是... 当然了,这就是这些指令的作用。export 命令将变量导出到环境中;如果没有这个命令,你只是设置一个不会被子进程继承的 shell 变量。 - larsks
1
sudo sh -c "echo 'export PATH=\$PATH:/usr/local/go/bin' >> /etc/profile" 更好。 - Cliven

1
sudo sh -c "echo MY_GLOBAL_ENV_TO_MY_CURRENT_DIR=$(pwd)" >> /etc/environment"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接