你想要做的是不可能的,或者更好地说,你尝试的方式是不可能的。
- 你的 bash 命令是错误的。
bash -s command
并不执行 command
。它只是将字符串 "command" 存储在变量 $1
中,然后将你带到提示符。这就是为什么 Python 脚本似乎会冻结。你原本打算做的应该是 bash -c command
。
- 你为什么要 source
.bashrc
?仅 source .bash_aliases
不就够了吗?
- 即使你的 bash 命令正确,所做的更改也只会在从 Python 启动的 bash 会话中生效。一旦那个 bash 会话被关闭并且你的 Python 脚本完成后,你又回到了原来的 bash 会话。从 Python 启动的 bash 会话中的所有更改都会丢失。
每次想要更改当前 bash 会话中的内容时,你必须从当前 bash 会话内部进行更改。你在 bash 中运行的大多数命令(系统命令、Python 脚本,甚至是 bash 脚本)都会生成另一个进程,并且你在另一个进程中所做的任何事情都不会影响你的第一个 bash 会话。
source
是一个 bash 内置命令,它允许你在当前运行的 bash 会话内执行命令,而不是生成另一个进程并在那里运行命令。定义一个 bash 函数是另一种在当前运行的 bash 会话中执行命令的方式。
有关 source 和 execute 的更多信息,请参见
这个答案。
如何达到你的目标
修改你的 Python 脚本,只对
.bash_aliases
做必要的更改。
准备一个 bash 脚本来运行你的 Python 脚本,然后 source
.bash_aliases
。
modify_bash_aliases.py "$@"
source ~/.bash_aliases
在你的
.bashrc
中添加一个别名,以便引用该脚本。
alias add_alias='source modify_bash_aliases.sh'
现在,当你在bash提示符中输入
add_alias some_alias
时,它会被替换为
source modify_bash_aliases.sh
然后执行。因为
source
是bash内置的,所以脚本内部的命令将在当前运行的bash会话中执行。Python脚本仍将在另一个进程中运行,但随后的
source
命令将在当前正在运行的bash会话中运行。
另一种方法是修改你的Python脚本,只需对
.bash_aliases
做必要的更改。
准备一个bash函数来运行你的Python脚本,然后源
.bash_aliases
。
add_alias() {
modify_bash_aliases.py "$@"
source ~/.bash_aliases
}
现在可以这样调用函数:add_alias some_alias