我的系统上安装了 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 python
shebang 行的脚本,并且您希望它调用某个不同版本的 Python:
- 创建一个目录例如
mkdir ~/myscript-bin
- 在该目录中链接您想要的版本,例如
ln -s /usr/bin/python4.2 ~/myscript-bin/python
- 运行脚本时,将此目录放在命令搜索路径的第一位:
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 都作为源。我对我的职能也做了同样的事情。