你想要做的事情是不可能的。或更好:您尝试如何做到这一点是不可能的。
-
你的 bash 命令是错误的。 bash -s command 不执行 command。它只是将字符串“command”存储在变量$1 中,然后将您带到提示符处。这就是python脚本似乎冻结的原因。你的意思是bash -c command。
-
你为什么要使用.bashrc?仅仅来源 .bash_aliases 还不够吗?
-
即使你的 bash 命令正确,更改也只会在从 python 启动的 bash 会话中生效。一旦该 bash 会话关闭,并且您的 python 脚本完成,您将回到原来的 bash 会话。从 python 启动的 bash 会话中的所有更改都将丢失。
每次您想在当前 bash 会话中更改某些内容时,都必须在当前 bash 会话中进行。您从 bash 运行的大多数命令(系统命令、python 脚本,甚至 bash 脚本)都会产生另一个进程,并且您在该进程中所做的一切都不会影响您的第一个 bash 会话。
source 是一个内置的 bash,它允许您在当前运行的 bash 会话中执行命令,而不是生成另一个进程并在那里运行命令。定义 bash 函数是在当前运行的 bash 会话中执行命令的另一种方式。
有关采购和执行的更多信息,请参阅this answer。
你可以做些什么来实现你想要的
修改您的 python 脚本,只对.bash_aliases 进行必要的更改。
准备一个 bash 脚本来运行你的 python 脚本,然后输入.bash_aliases。
#i am a bash script, but you have to source me, do not execute me.
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