@yangfch3
2017-06-04T22:58:27.000000Z
字数 708
阅读 2803
Node
Linux/Shell
目录结构如下:
D/
|---d/
|---f.sh
|---test.txt < echo 'hello world!'
f.sh
脚本内容如下:
pwd
cat ./test.txt
此时我们在目录 d
下运行 sh f.sh
,能正确得到预期的输出。
D/d
hello world!
但是当我们在目录 D
下(或其他目录下)运行 sh d/f.sh
(sh path/to/f.sh
),得到的结果就不同了:
D/
cat: test.txt: No such file or directory
与上面 Shell 的例子差不多,将 Shell 中 cat
改为 Node.js 中的 fs.readFileSync()
,在不同的路径下得到的输出也存在一样的问题。
原因:存储目录与命令执行目录(工作目录)的差异。
为了更好的理解,你可以 将脚本文件忽略,即 相当于文件内的脚本直接在工作目录被执行。
例如:在 D/
下执行 sh d/f.sh
其实本质上就是 d/f.sh
脚本的内容直接在 D/ 下被执行,脚本内路径的计算也就是相对于 D/ 咯。
理解了这一点也就不难理解执行目录带来的问题了。
在 Node.js 中比较特殊的一点是:模块的 require。(见下文)
Node.js 中的路径分为两类:
require
模块/脚本时的路径其中,第 2 点与上文提到的规则一致。而第 1 点则是 Node.js 模块加载的特性,如果一个脚本内 require 一个相对路径的脚本,那么不论在何处执行该脚本,最终 require 路径的计算都是基于脚本所在位置(而非工作目录)。