[javascript] Node 스크립트를 실행할 때 현재 쉘 컨텍스트에서 작업 디렉토리 변경

bin 스크립트에서 실행할 때 Node.js 스크립트의 작업 디렉토리를 변경하려고합니다. 다음과 같은 것이 있습니다.

#!/usr/bin/env node
process.chdir('/Users')

그런 다음이 파일을로 실행하면 ./bin/nodefile종료되지만 현재 쉘 컨텍스트의 작업 디렉토리는 변경되지 않았습니다. 나는 또한 shelljs 시도했지만 그것도 작동하지 않습니다.

이를 수행하는 가장 좋은 방법은 무엇입니까? 작동하고 있지만 별도의 프로세스에 있음을 이해합니다.



답변

디렉토리를 변경하는 올바른 방법은 실제로 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'


답변

Node 프로세스를 실행하는 기본 셸 의 CWD를 변경하는 기본 제공 방법은 없습니다 .

명령을 통해 Node 프로세스 의 현재 작업 디렉토리를 변경할 수 있습니다 .process.chdir()

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

노드 프로세스가 존재하면 프로세스를 시작한 CWD로 돌아갑니다.


답변

당신이하려는 것은 불가능합니다. 그 이유는 POSIX 시스템 (Linux, OSX 등)에서 하위 프로세스가 상위 프로세스의 환경을 수정할 수 없기 때문입니다. 여기에는 상위 프로세스의 작업 디렉토리 및 환경 변수 수정이 포함됩니다.

명령 줄에서 Node 스크립트를 실행하면 현재 프로세스 ( bash,, zsh무엇이든간에)가 자체 환경, 일반적으로 현재 환경의 복사 본인 새 프로세스를 생성합니다 (시스템 호출을 통해 변경할 수 있음). ; 그러나 그것은이 회신의 범위를 벗어납니다), 그 프로세스는 완전히 격리 된 상태에서해야 할 일을 할 수 있습니다. 하위 프로세스가 종료되면 제어가 환경에 영향을 미치지 않은 셸의 프로세스로 다시 넘겨집니다.

여기에는 많은 이유가 있지만 한 가지 이유는 백그라운드에서 (을 통해 ./foo.js &) 스크립트를 실행하고 실행하면서 작업 디렉토리를 변경하거나 PATH. 그것은 악몽이 될 것입니다.

쉘의 작업 디렉토리를 변경해야하는 일부 작업을 수행해야하는 경우 쉘에 함수를 작성해야합니다. 예를 들어 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 스크립트를 호출 할 수 있습니다.

이것이 당신이하려는 일을 성취 할 수있는 유일한 방법입니다.


답변

짧은 대답 : 아니요 (쉬운?) 방법이지만 목적에 맞는 일을 할 수 있습니다.

비슷한 도구 (프로젝트에 대한 설명이 주어지면 환경, 경로, 디렉터리 등을 설정하는 작은 명령)를 수행했습니다. 내가하는 일은 모든 것을 설정하고 다음과 같이 쉘을 생성하는 것입니다.

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

실행 후 새 디렉토리 (내 경우에는 환경)가있는 셸에있게됩니다. 물론 원하는 쉘에 대해 bash를 변경할 수 있습니다. 원래 요청한 것과의 주요 차이점은 다음과 같습니다.

  • 추가 프로세스가 있으므로 …
  • 돌아 오려면 ‘exit’라고 써야하고 …
  • 기존 후에는 모든 변경이 취소됩니다.

그러나 저에게는 그 차이가 바람직합니다.


답변