javascript 运行节点脚本时更改当前shell上下文中的工作目录

hiz5n14c  于 2022-10-30  发布在  Java
关注(0)|答案(6)|浏览(146)

当我从bin脚本运行Node.js脚本时,我试图更改它的工作目录。我得到了如下结果:


# !/usr/bin/env node

process.chdir('/Users')

当我用./bin/nodefile运行这个文件时,它退出了,但是当前shell上下文的工作目录没有改变。我也试过shelljs,但是也不起作用。
最好的方法是什么?我知道它是有效的,但它只是在一个单独的过程。

uurv41yg

uurv41yg1#

更改目录的正确方法实际上是使用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);
}

这也可以在Node.js REPL中测试:

[monitor@s2 ~]$ node
> process.cwd()
'/home/monitor'
> process.chdir('../');
undefined
> process.cwd();
'/home'
kqqjbcuj

kqqjbcuj2#

Node没有内置的方法来更改运行Node进程的 * 底层shell* 的CWD。
您 * 可以 * 通过命令process.chdir()更改 * 节点进程 * 的当前工作目录。

var process = require('process');
process.chdir('../');

当节点流程存在时,您将发现自己回到了启动流程的CWD中。

bkhjykvo

bkhjykvo3#

您尝试执行的操作是不可能的。这是因为在POSIX系统(Linux、OSX等)中,子进程不能修改父进程的环境。这包括修改父进程的工作目录和环境变量。
当您在命令行上执行Node脚本时,您当前的进程(bashzsh,等等)会产生一个新的进程,它有自己的环境,通常是您当前环境的副本(可以通过系统调用来改变它;但这超出了本文的讨论范围),允许该进程在完全隔离的情况下执行它需要执行的任何操作。当子进程退出时,控制权被交还给shell进程,在那里环境没有受到影响。
这有很多原因,但其中一个原因是,假设您在后台执行一个脚本(通过./foo.js &),当它运行时,它开始更改您的工作目录或覆盖您的PATH
如果你需要执行一些需要改变shell工作目录的操作,你需要在shell中编写一个函数,例如,如果你正在运行Bash,你可以把这个函数放在~/.bash_profile中:

do_cool_thing() {
  cd "/Users"
  echo "Hey, I'm in $PWD"
}

然后这个很酷的事情是可行的:

$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users

如果您还需要做更复杂的事情,您可以随时从该函数调用您的nodejs脚本。
这是你能完成你想做的事的唯一方法。

cunj1qz1

cunj1qz14#

简短回答:没有(容易的?)方法,但你可以做一些服务于你的目的。
我做过一个类似的工具(一个小命令,给出一个项目的描述,设置环境、路径、目录等)。我所做的是设置好一切,然后使用以下命令生成一个shell:

spawn('bash', ['-i'], {
  cwd: new_cwd,
  env: new_env,
  stdio: 'inherit'
});

在执行之后,您将在一个具有新目录的shell上(在我的例子中,还有environment)。当然,您可以将bash更改为您喜欢的任何shell。与您最初要求的主要区别在于:

  • 还有一个额外的过程,所以...
  • 你得写“退出”才能回来然后...
  • 存在后,所有更改都将撤消。

然而,对我来说,这种差异是可取的。

b5buobof

b5buobof5#

请尝试以下代码:

const dirPath = path.join(__dirname, foldername);
process.chdir(dirPath);
hmae6n7t

hmae6n7t6#

function cd(a, b) {
  var a_path_arry = a.split('/');
  var a_clear_path = [];
  var b_clear_path = [];
  a_path_arry.map((ele) => {
   if(ele != '') a_clear_path.push(ele);
  });

  b_path_arry = b.split('/');
  b_path_arry.map((ele) => {
    if(ele != '') b_clear_path.push(ele);
  });
  b_path_length = b_clear_path.length;

  for(var i=0;i<b_path_length;i++) {
    if(b_clear_path[i] == '.') {
        continue;
    } else if(b_clear_path[i] != '..') {
        a_clear_path.push(b_clear_path[i])
    }  
    else {
        a_clear_path.pop();            
    }
  }

  var path = '';
  a_clear_path.map((ele)=> {
    path += ele + '/';
  });

  console.log(path);

}

cd('a/b/c', './//d/e');

相关问题