@yangfch3
2017-06-04T14:58:27.000000Z
字数 708
阅读 3122
Node Linux/Shell
目录结构如下:
D/|---d/|---f.sh|---test.txt < echo 'hello world!'
f.sh 脚本内容如下:
pwdcat ./test.txt
此时我们在目录 d 下运行 sh f.sh,能正确得到预期的输出。
D/dhello 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 路径的计算都是基于脚本所在位置(而非工作目录)。
