.zshrc 中定义的别名不会传播到 shell 脚本

.zshrc 中定义的别名不会传播到 shell 脚本

我的系统上安装了 python 作为python3.在我的.zshrc文件中,我定义了以下别名:

alias python=python3

这样,我就可以在命令行上python3运行:python

$ python
Python 3.11.6 (main, Nov  2 2023, 04:39:43) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

但如果我写一个像这样的 shell 脚本test.sh

#!/bin/bash
python

然后尝试按如下方式运行此脚本:

$ ./test.sh

我得到:

./test.sh: line 2: python: command not found

这是怎么回事?我该如何解决?需要明确的是,这是在 Mac 上,但我认为结果在 Linux 上应该是相同的。谢谢。

答案1

别名和函数不会传播到 shell 脚本。这是设计使然。它们允许您为标准命令名称定义非标准行为。在脚本中提供这些内容可能会破坏脚本。对于通常用于向命令添加默认选项的别名来说尤其如此。

如果您的脚本需要使用不同名称的命令,请在$PATH.如果脚本需要命令的非标准版本,请使用专用目录来运行脚本。例如,如果您有一个python显式调用的脚本,或者一个带有#!/usr/bin/env pythonshebang 行的脚本,并且您希望它调用某个不同版本的 Python:

  1. 创建一个目录例如mkdir ~/myscript-bin
  2. 在该目录中链接您想要的版本,例如ln -s /usr/bin/python4.2 ~/myscript-bin/python
  3. 运行脚本时,将此目录放在命令搜索路径的第一位:PATH=~/myscript-bin:$PATH myscript

对于 Python,有相当多的工具可以帮助拥有多个版本,特别是有助于管理库。如果您的脚本需要非默认版本的 Python 或一组非默认的 Python 库,请创建一个虚拟环境为了它。

python4.2 -m venv ~/myscript-env
# If the script needs extra packages:
(. ~/myscript-env/activate && pip install package1 package2)
(. ~/myscript-env/activate && myscript)

答案2

正如 Ed 所解释的,zsh 和 bash 是 2 个不同的环境。由于 Apple 将其默认 shell 更改为 zsh,并且我仍然在 bash 中编写 shell 脚本,因此我最终将别名放在 .alias 文件中,然后将 .zshrc 和 .bashrc 都作为源。我对我的职能也做了同样的事情。

相关内容