众所周知,在终端 shell 中创建别名非常容易:
ZZ:~ zhangzhao$ alias c='uname' ZZ:~ zhangzhao$ c Darwin ZZ:~ zhangzhao$
但现在我想通过 Python3 脚本做同样的事情。我查看了参考手册,发现这类命令工作可以使用subprocess模块解决。
subprocess
然后我写下下面的脚本:
import subprocess subprocess.call(["alias", "c=\'uname\'"])
但需要注意的是,这个操作并不会对你当前使用的shell生效,而是使用子shell然后退出。所以这个脚本所做的一切都是徒劳的。
所以我的问题是:如何通过执行 python 脚本在当前使用的 shell 中创建别名?
在 Python 中使用 subprocess.call 或其他类似的函数启动子进程时,操作会在子进程中执行,而不会影响当前的 shell 环境。由于 alias 是 shell 命令,且在当前 shell 会话中生效,因此需要让 Python 脚本在当前 shell 会话中执行命令。直接通过 subprocess 执行将不会实现您想要的效果。
subprocess.call
alias
您有几种选择可以让 Python 脚本在当前 shell 环境中生效:
一种方法是让 Python 脚本输出 alias 命令,并通过 shell 直接执行它。例如,您可以通过运行以下命令将 alias 命令传递给当前 shell 会话:
$ python3 -c 'import os; print("alias c=\'uname\'")' >> ~/.bashrc
这样做的效果是将 alias 添加到 ~/.bashrc 文件中,然后您可以在后续的 shell 会话中使用该别名。或者如果您想立即生效,可以使用 source 命令:
~/.bashrc
source
$ source ~/.bashrc
exec
另一种方法是通过 exec 直接在 shell 中执行命令。您可以通过执行如下的 Python 脚本:
import os # 将 alias 添加到当前 shell 会话 os.system("alias c='uname'")
然而,这只会对当前的 Python 进程有效,并不会影响外部 shell。
如果您希望通过 Python 设置别名并在之后的 shell 会话中使用该别名,您可以启动一个新的 shell 会话并执行 alias 命令:
import subprocess # 启动一个新的 shell 会话,设置别名并执行命令 subprocess.call("bash -c 'alias c=\"uname\"; exec bash'", shell=True)
这将启动一个新的 Bash 会话,设置 alias,并进入该会话,您可以在其中执行该别名。
.bashrc
.zshrc
如果您希望在所有 shell 会话中都能使用该别名,您可以将 alias 命令添加到您的 .bashrc 或 .zshrc 文件中。
例如,使用 Python 在 .bashrc 中添加别名:
with open(os.path.expanduser("~/.bashrc"), "a") as bashrc: bashrc.write("\nalias c='uname'\n")
然后,您需要通过 source ~/.bashrc 或重新打开终端来使更改生效。
source ~/.bashrc
直接通过 Python 脚本设置当前 shell 会话中的别名并不容易,因为 Python 脚本的子进程执行的命令不会影响父进程(即当前的 shell 会话)。如果您希望设置永久别名,可以将命令添加到 shell 配置文件中(如 .bashrc 或 .zshrc),然后重新加载配置文件使之生效。