[关闭]
@yangfch3 2017-06-04T22:58:27.000000Z 字数 708 阅读 2822

Node.js 与 Shell 中的路径问题

Node Linux/Shell


看两个情况

Shell

目录结构如下:

  1. D/
  2. |---d/
  3. |---f.sh
  4. |---test.txt < echo 'hello world!'

f.sh 脚本内容如下:

  1. pwd
  2. cat ./test.txt

此时我们在目录 d 下运行 sh f.sh,能正确得到预期的输出。

  1. D/d
  2. hello world!

但是当我们在目录 D 下(或其他目录下)运行 sh d/f.shsh path/to/f.sh),得到的结果就不同了:

  1. D/
  2. cat: test.txt: No such file or directory

Node.js

与上面 Shell 的例子差不多,将 Shell 中 cat 改为 Node.js 中的 fs.readFileSync(),在不同的路径下得到的输出也存在一样的问题。

原因

原因:存储目录与命令执行目录(工作目录)的差异。

为了更好的理解,你可以 将脚本文件忽略,即 相当于文件内的脚本直接在工作目录被执行

例如:在 D/ 下执行 sh d/f.sh 其实本质上就是 d/f.sh 脚本的内容直接在 D/ 下被执行,脚本内路径的计算也就是相对于 D/ 咯

理解了这一点也就不难理解执行目录带来的问题了。

在 Node.js 中比较特殊的一点是:模块的 require。(见下文)

Node.js 中的路径相关

Node.js 中的路径分为两类:

  1. require 模块/脚本时的路径
  2. 其他 API 用到的路径

其中,第 2 点与上文提到的规则一致。而第 1 点则是 Node.js 模块加载的特性,如果一个脚本内 require 一个相对路径的脚本,那么不论在何处执行该脚本,最终 require 路径的计算都是基于脚本所在位置(而非工作目录)。

最佳实践

  1. 优先选用绝对路径
  2. 路径的动态计算
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注