Jon*_*ono 102 javascript terminal cd command-line-interface node.js
我正在尝试从bin脚本运行时更改我的Node.js脚本的工作目录.我有以下内容:
#!/usr/bin/env node
process.chdir('/Users')
Run Code Online (Sandbox Code Playgroud)
当我随后运行此文件时./bin/nodefile
,它会退出,但当前shell上下文的工作目录没有更改.我也试过shelljs,但这也不起作用.
做这个的最好方式是什么?我知道它有效,但它只是在一个单独的过程中.
hex*_*ide 133
改变目录的正确方法实际上是process.chdir(directory)
.以下是文档中的示例:
console.log('Starting directory: ' + process.cwd());
try {
process.chdir('/tmp');
console.log('New directory: ' + process.cwd());
}
catch (err) {
console.log('chdir: ' + err);
}
Run Code Online (Sandbox Code Playgroud)
这在Node.js REPL中也是可测试的:
[monitor@s2 ~]$ node
> process.cwd()
'/home/monitor'
> process.chdir('../');
undefined
> process.cwd();
'/home'
Run Code Online (Sandbox Code Playgroud)
dth*_*ree 31
Node没有内置方法来更改运行Node进程的底层shell的CWD .
您可以通过命令更改Node进程的当前工作目录process.chdir()
.
var process = require('process');
process.chdir('../');
Run Code Online (Sandbox Code Playgroud)
当Node进程存在时,您会发现自己回到了启动该进程的CWD中.
Spi*_*ein 13
你想要做的是不可能的.原因是在POSIX系统(Linux,OSX等)中,子进程无法修改父进程的环境.这包括修改父进程的工作目录和环境变量.
当您在命令行上并执行Node脚本时,您当前的进程(bash
,zsh
无论如何)会生成一个具有自己环境的新进程,通常是当前环境的副本(可以通过系统调用进行更改) ;但这超出了本回复的范围),允许该过程在完全隔离中做任何需要做的事情.当子进程退出时,控制权将交还给shell的进程,在该进程中环境不受影响.
这有很多原因,但是对于一个,假设你在后台执行了一个脚本(via ./foo.js &
),当它运行时,它开始改变你的工作目录或覆盖你的PATH
.那将是一场噩梦.
如果需要执行一些需要更改shell工作目录的操作,则需要在shell中编写一个函数.例如,如果你正在运行Bash,你可以把它放在你的~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
Run Code Online (Sandbox Code Playgroud)
然后这很酷的事情是可行的:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Run Code Online (Sandbox Code Playgroud)
如果你还需要做更复杂的事情,你总是可以从该函数调出你的nodejs脚本.
这是你完成你想要做的事情的唯一方法.
小智 9
简答:没有(简单?)方式,但你可以做一些符合你目的的事情.
我已经完成了一个类似的工具(一个小命令,给定一个项目的描述,设置环境,路径,目录等).我所做的是设置所有内容,然后生成一个shell:
spawn('bash', ['-i'], {
cwd: new_cwd,
env: new_env,
stdio: 'inherit'
});
Run Code Online (Sandbox Code Playgroud)
执行之后,你将在一个带有新目录的shell上(在我的例子中,环境).当然,您可以根据自己喜欢的外壳更改bash.与您最初要求的主要区别是:
但是,对我来说,这种差异是可取的.
归档时间: |
|
查看次数: |
91168 次 |
最近记录: |