理由为/
POSIX路径规则
在以下位置提到了该规则:为什么在可执行文件或脚本名称之前需要./(点斜杠)才能在bash中运行它?但我想更详细地解释为什么我认为这是一个好的设计。
首先,该规则的明确完整版本为:
- 如果路径中包含
/
(例如./someprog
,/bin/someprog
,./bin/someprog
):CWD被使用并且PATH是不
- 如果路径不包含
/
(例如someprog
):使用PATH而不使用CWD
现在,假设正在运行:
someprog
会搜索:
然后,如果您想/bin/someprog
从发行版运行,则可以执行以下操作:
someprog
它有时可能会起作用,但其他情况却会失败,因为您可能位于包含另一个不相关someprog
程序的目录中。
因此,您很快就会知道这是不可靠的,并且最终在要使用PATH时总是使用绝对路径,因此违反了PATH的目的。
这也是为什么在PATH中包含相对路径是一个非常糟糕的主意。我在看着你node_modules/bin
。
相反,假设正在运行:
./someprog
将搜索:
然后,如果您只是someprog
从git存储库下载了一个脚本并想从CWD运行它,则您将无法确定这是将要运行的实际程序,因为您的发行版可能具有:
/bin/someprog
去年圣诞节后喝了太多酒后安装的某些软件包中的PATH包含在PATH中。
因此,再次,您将不得不始终使用完整路径相对于CWD运行本地脚本,以了解您正在运行的内容:
"$(pwd)/someprog"
这也将非常烦人。
您可能会想出的另一条规则是:
相对路径仅使用PATH,绝对路径仅使用CWD
但这又迫使用户始终对的非PATH脚本使用绝对路径"$(pwd)/someprog"
。
该/
路径搜索规则提供了一个简单的记忆解决问题有关:
- 斜线:不要使用
PATH
- 不加斜线:仅使用
PATH
通过依靠当前目录中的文件可以表示为./somefile
或的事实,使始终知道正在运行的内容变得非常容易somefile
,因此它给其中一个赋予了特殊的含义。
有时,您无法搜索some/prog
相对于会有点烦人PATH
,但我看不出对此有更明智的解决方案。