如何向 bashrc 添加别名并使用 sudo 加载内容?

如何向 bashrc 添加别名并使用 sudo 加载内容?

我需要使用 运行我的脚本sudo,因为它包含使用 apt 安装程序的命令。因此我执行以下操作:

sudo ./myscript.sh

包含内容:

#!/bin/bash

# add alias .bashrc (work)
echo "alias myupgrade='sudo aptitude -y safe-upgrade && sudo updatedb'" | sudo tee -a /home/my_user/.bashrc > /dev/null
# or
# sudo -u my_user bash -c "echo alias myupgrade=\"'sudo aptitude -y safe-upgrade && sudo updatedb'\"" >> ~/.bashrc

# load changes (doesn't work)
sudo -u my_user bash -c "source /home/my_user/.bashrc"

# rest of script (not relevant for the question). e.g:
apt -y install foo bar etc

我的脚本可以正常将别名添加到 bashrc,但其余部分不起作用。我在脚本中尝试了以下命令,但没有成功:

# doesn't work
sudo su - my_user -c "source /home/my_user/.bashrc"
source /home/my_user/.bashrc
source ~/.bashrc
sudo bash --rcfile /home/my_user/.bashrc

有什么帮助吗(ubuntu 22.04)?提前致谢

更新(解决方法):

有一个解决方法发布这里,打开终端并运行临时别名:

# create temporary aliases
alias myupgrade='apt-get update && apt-get dist-upgrade && aptitude -y safe-upgrade && updatedb'
# creating temporary sudo aliases
alias sudo='sudo '
# run temporary aliases (doesn't work inside bash script)
sudo myupgrade

但它在 bash 脚本中不起作用

答案1

expand_aliases需要启用shell 选项别名待扩展...对于交互式 shell,它默认启用,但对于非交互式 shell,它默认不启用(就像你的脚本默认运行的那样) ... 所以,

任何一个

将您的 shebang 更改为:

#!/bin/bash -i

或者,也可以像这样运行脚本文件:

sudo /bin/bash -i myscript.sh

在交互式 shell 中运行脚本。

或者

添加:

shopt -s expand_aliases

在脚本文件顶部的 shebang 之后启用非交互式 shell 中的别名扩展。

然后

在调用别名之前,请在脚本中尽早获取包含别名的文件及其完整路径,如下所示:

source /home/my_user/.bashrc

或者在调用别名之前在同一脚本中尽早定义别名,如下所示:

alias myupgrade='aptitude -y safe-upgrade && updatedb'

注意

如果你使用如下方式运行脚本文件sudo

sudo ./myscript.sh

或者:

sudo /bin/bash myscript.sh

那么您不需要使用sudo其包含或来源的任何命令/别名,因为它们都将在用户下运行root

相关内容