ajc*_*jcg 2 command-line bash scripts alias bashrc
我需要使用 运行我的脚本sudo,因为它包含使用 apt 安装程序的命令。所以我这样做:
sudo ./myscript.sh
Run Code Online (Sandbox Code Playgroud)
内容:
#!/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
Run Code Online (Sandbox Code Playgroud)
我的脚本将别名添加到 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
Run Code Online (Sandbox Code Playgroud)
有帮助吗(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
Run Code Online (Sandbox Code Playgroud)
但它在 bash 脚本中不起作用
expand_aliases需要启用shell 选项才能扩展别名...默认情况下,交互式 shell 会启用该选项,但非交互式 shell 默认情况下不会启用该选项(就像您的脚本默认运行的那样)...所以,
将您的 shebang 更改为:
#!/bin/bash -i
Run Code Online (Sandbox Code Playgroud)
或者,也可以像这样运行脚本文件:
sudo /bin/bash -i myscript.sh
Run Code Online (Sandbox Code Playgroud)
在交互式 shell 中运行脚本。
添加:
shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)
位于脚本文件顶部的 shebang 之后,以在非交互式 shell 中启用别名扩展。
在调用别名之前,在脚本的早期获取包含别名的文件的完整路径,如下所示:
source /home/my_user/.bashrc
Run Code Online (Sandbox Code Playgroud)
或者在调用别名之前在同一脚本中尽早定义别名,如下所示:
alias myupgrade='aptitude -y safe-upgrade && updatedb'
Run Code Online (Sandbox Code Playgroud)
sudo如果您使用以下命令运行脚本文件:
sudo ./myscript.sh
Run Code Online (Sandbox Code Playgroud)
或者:
sudo /bin/bash myscript.sh
Run Code Online (Sandbox Code Playgroud)
然后,您不需要sudo在任何包含或来源的命令/别名中使用,因为它们都将在 user 下运行root。
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |