我的 $PATH 有 /a/path/with space/in/it
我只需输入可执行文件的名称即可运行位于所述路径上的可执行文件。
但是当我尝试对它们应用命令时,它们失败并出现“找不到”错误。
例如。我的路径上有一个名为 prog.py 的 python 脚本
如果我只输入 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)?
答案1
这与包含空格的目录名无关。当您运行python3 prog.py
orfile prog.py
时,您指定了一个相对路径,标准 Unix 语义意味着它将从当前工作目录打开。没有明智的方法可以改变这一点。
但是,如果您使脚本可执行(chmod +x /path/to/prog.py
)并确保它#!
在顶部有正确的行(可能#! /usr/bin/python3
),那么您将能够通过说prog.py
(不是python3 prog.py
)从任何地方执行它。
$PATH
顺便说一句,对于程序来说,不包含指定其实现的扩展通常是一个好主意,因为这实际上是一种分层冲突;我建议只调用它prog
(适当替换)而不是prog.py
.
答案2
我相信问题不在于空间。您尝试过没有空格的路径吗?
关键是,$PATH
是寻找可执行文件的路径,而不是随机类型的文件。
例如,如果您有一个可执行文件抱怨缺少库,则必须使用$LD_LIBRARY_PATH
告诉它文件在哪里。添加文件的位置$PATH
没有帮助。另一方面,如果您在编译时遇到缺少的库,则需要另一个变量(即$LIBRARY_PATH
)。
因此,最好的解决方案是将适当的 shebang 添加到您的 python 脚本中,并将它们放在$PATH
.如果您希望能够将它们导入到需要使用的任何地方$PYTHONPATH
。
答案3
这就是您引用prog.py
文件的方式
python3 prog.py
说“在我当前的工作目录中有一个名为 prog.py 的文件”
你的第二个例子 - 你使用的地方./prog.py
- 你明确指出“在当前目录中你会找到一个名为 prog.py 的程序”
您的 $PATH 只搜索命令 - 不搜索命令的参数。
如果你想调用 python 二进制文件(或任何其他二进制文件,如cat
orsed
或less
or ...),那么它应该在你的 $PATH 中 - 你似乎有。要引用任何其他文件,您必须始终提供该文件的完整相对路径或完整绝对路径。