工作目录按我的理解是一个软件运行时所在的目录,软件内部使用的路径中.
和..
会使用工作目录作为参考
# 家目录~下有一个 b.out 的程序
~$ cat b.c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
~$ gcc b.c
# ~/Project 下有一个 a.out 程序,其会调用 b.out(使用的是相对路劲)
~$ cd Project
~/Project$ cat a.c
#include <stdio.h>
#include <unistd.h>
int main() {
char *args[] = {"./b.out", NULL};
if (execvp(args[0], args) == -1) {
perror("execvp failed");
return 1;
}
return 0;
}
~/Project$ gcc a.c
# 在 b.out 所在的家目录下调用 a.out ,工作目录是~,使用./b.out 能找到 b
~/Project$ cd ~
~$ ~/Project/a.out
Hello, World!
换成 node 、python 这种解释型语言,发现就和我想的不一样了
# ~/Project 目录下存在 vue 模块
~/Project$ ls node_modules
vue @vue vie @vitejs
# 在家目录~下存在一个 a.js ,其使用 vue 模块
~/Project$ cd ~
~$ cat a.js
let vue = require('vue');
console.log(vue);
# 在~/Project 目录下运行 a.js
# 当前工作目录下存在 vue 模块,但 a.js 文件所在的目录以及其上级目录不存在 vue 模块
~$ cd Project
~/Project$ node ~/a.js
...
Error: Cannot find module 'vue'
Require stack:
- /home/yezheyu/pwd.js
at Module._resolveFilename (node:internal/modules/cjs/loader:1143:15)
at Module._load (node:internal/modules/cjs/loader:984:27)
at Module.require (node:internal/modules/cjs/loader:1231:19)
...
# 让 a.js 文件所在的路径包含 vue 模块
~/Project$ mv ~/a.js ~/Project
# 在~目录下运行 a.js
# 当前工作目录下不存在 vue 模块,但 a.js 所在的目录下包含 vue 模块,运行不会报错
~/Project$ cd ~
~$ node ~/Project/a.js
{
EffectScope: [class EffectScope],
ReactiveEffect: [class ReactiveEffect],
customRef: [Function: customRef],
effect: [Function: effect],
...
}
这是为什么呢?
是解释器有着一套自己的相对路径解析策略
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.