环境解释器
Linux 脚本是怎么找到解释器的?
当执行一个脚本(比如 pdb2pqr30)时,系统会先看这个脚本文件的 第一行,也就是所谓的 shebang 行(以 #! 开头)。
比如:
- #!/usr/bin/python3
这就告诉系统: 这个脚本要用 /usr/bin/python3 来解释执行。
如果第一行写的是:
- #!/home/lywu/anaconda3/envs/pdb2pqr/bin/python3.11
那么系统会去这个确切的路径下找 python3.11 程序来运行脚本。
2. 关于报错
- (pdb2pqr) [lywu@localhost apo]$ pdb2pqr30 3krb-E21A.pdb 3krb-E21A.pqr --ff AMBER --ffout AMBER --with-ph 7.4 --pdb-output pred.pdb
- -bash: /home/lywu/miniforge3/envs/pdb2pqr/bin/pdb2pqr30: /home/lywu/anaconda3/envs/pdb2pqr/bin/python3.11: bad interpreter: No such file or directory
pdb2pqr30 文件里的第一行是:
- vim /home/lywu/miniforge3/envs/pdb2pqr/bin/pdb2pqr30
- #!/home/lywu/anaconda3/envs/pdb2pqr/bin/python3.11
但是你目前conda 环境现在装在 /home/lywu/miniforge3/envs/pdb2pqr 下面,而不是 /home/lywu/anaconda3/...。所以系统就找不到这个路径,提示:
- bad interpreter: No such file or directory
也就是说,脚本想用一个已经不存在的 python 来运行。
方法 A:改 shebang
把第一行改成:
- #!/usr/bin/env python
这里的 env 会去 当前环境 的 $PATH 里查找合适的 python,所以无论你在 anaconda 还是 miniforge 环境下,都能找到正确的 python 解释器。
方法 B:不用 shebang,直接用 python 执行
你也可以完全绕开 shebang,直接用你当前环境的 python 来执行:
- python -m pdb2pqr 3krb-E21A.pdb 3krb-E21A.pqr --ff=AMBER --ffout=AMBER --with-ph=7.4 --pdb-output=pred.pdb
这里 -m pdb2pqr 就是告诉 python 去运行 pdb2pqr 这个模块,不依赖脚本里的 shebang。
什么叫解释器?什么叫shebang?
1. 什么是 解释器?
计算机只认识 机器码 (0 和 1),人写的程序(Python、Perl、Bash 等)不是机器码,必须要有一个“翻译官”把它们 解释并执行。
这个“翻译官”就是 解释器 (interpreter)。
- 对 Python 程序 来说,解释器就是 python 或 python3。
- 对 Bash 脚本 来说,解释器就是 bash。
- 对 Perl 脚本 来说,解释器就是 perl。
👉 解释器 = 执行你写的代码的软件。
2. 什么是 shebang?
当你写一个脚本(比如 pdb2pqr30)时,系统需要知道 用哪个解释器 来运行它。
这时候就要靠脚本文件的 第一行,叫 shebang(来源于 #!)。比如:
- #!/usr/bin/python3
意思是:这个脚本要用 /usr/bin/python3 来解释执行。
再比如:
- #!/bin/bash
意思是:这个脚本要用 /bin/bash 来运行。
如果你写的是:
- #!/usr/bin/env python3
意思是:让系统去环境变量 $PATH 里自动查找合适的 python3,更灵活。
- 解释器:运行脚本的“翻译官”(Python 用 python,Shell 用 bash)。
- shebang:脚本第一行,用来告诉系统“要用哪个解释器来执行这个脚本”。
