我的 $PATH 有 /a/path/with 空格/in/it
我只需键入名称即可运行位于所述路径上的可执行文件。
但是当我尝试对它们应用命令时,它们会因找不到错误而失败。
例如。我在路径上有一个 python 脚本,称为 prog.py
如果我只输入 prog.py,我的 shell 会尝试运行它。所以这条路是有效的。但:
$ python3 prog.py
python3: can't open file 'prog.py': [Errno 2] No such file or directory
$ file prog.py
prog.py: cannot open `prog.py' (No such file or directory)
如果我 cd 到 prog.py 的实际位置,然后尝试相同的命令,它们会按预期运行:
$ file ./prog.py
./prog.py: Python script, ASCII text executable
$ python3 ./prog.py
True
为什么会这样?我该怎么做才能从我希望的任何地方执行这些命令(尤其是 python3)?
我相信问题不在于空间。你试过没有空格的路径吗?
关键是
$PATH
寻找可执行文件的路径,而不是随机类型的文件。例如,如果您有一个可执行文件抱怨缺少库,您必须使用
$LD_LIBRARY_PATH
它来告诉它文件在哪里。添加文件的位置$PATH
将无济于事。另一方面,如果您在编译时遇到缺少的库,则需要另一个变量(即$LIBRARY_PATH
)。所以最好的解决方案是在你的 python 脚本中添加适当的 shebangs 并将它们放在
$PATH
. 如果您希望能够在任何需要使用$PYTHONPATH
.这与包含空格的目录名称无关。当您运行
python3 prog.py
orfile prog.py
时,您指定的是相对路径,标准 Unix 语义意味着它将从当前工作目录打开。没有明智的方法可以改变这一点。但是,如果您使脚本可执行 (
chmod +x /path/to/prog.py
) 并确保它#!
在顶部有正确的行(可能#! /usr/bin/python3
),那么您将能够通过说prog.py
(notpython3 prog.py
) 从任何地方执行它。顺便说一句,程序
$PATH
不包含指定其实现的扩展通常是个好主意,因为这确实违反了分层;我建议只调用它prog
(酌情替换)而不是prog.py
.这是您引用
prog.py
文件的方式python3 prog.py
说“在我当前的工作目录中有一个名为 prog.py 的文件”您的第二个示例-您使用的位置
./prog.py
-您明确说明“在当前目录中,您将找到一个名为 prog.py 的程序”您的 $PATH 仅搜索命令 - 而不是命令的参数。
如果您想调用 python 二进制文件(或任何其他二进制文件,如
cat
orsed
或less
or ...),那么它应该在您的 $PATH 中 - 您似乎拥有。要引用任何其他文件,您必须始终提供该文件的完整相对路径或完整绝对路径。