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


114

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

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

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

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


암호가 변경되지 않았다는 어떤 증거가 있습니까? require ()와 cwd에서 사용되는 경로는 서로 다른 두 가지입니다.
jeesty

Windows에서이 작업을 수행하는 방법이 있습니까?
Phillip

답변:


146

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

죄송합니다. 예, 이것이 제가 실제로 사용하는 명령입니다. 그러나 간단한 스크립트에서 사용할 때 여전히 작동하지 않는 것 같습니다 (스크립트가 종료되면 여전히 이전 디렉토리에 있습니다) process.cwd ()를 호출하면 내가 있어야하지만 내 내가 pwd를 호출하면 터미널은 내가 다른 것에 있다고 말합니다. 다른 과정이기 때문에?
Jonovono

10
이 메소드 는 쉘이 아닌 프로세스 의 현재 작업 디렉토리를 변경합니다 . 내가 아는 한, 실행중인 프로세스의 외부 cwd를 변경하는 것은 매우 복잡하며 권장되지 않습니다. 이것을하고 싶은 이유는 무엇입니까?
hexacyanide 2013

3
흠. 알았어 고마워. 제가 이것을하고 싶은 이유는 프로젝트를 구성하기위한 터미널 앱을 만들고 있기 때문입니다. 그래서 기본적으로 내 프로젝트를 나열하고 현재 쉘 위치를 쉽게 변경할 수 있기를 원합니다. 이제 생각 했으니 z ( github.com/rupa/z )가 어떻게이 작업 을 수행하는지 살펴 보겠습니다 . bash에서 수행되지만. 나는 아마도 이것을 applescript에서 할 수 있습니까?
Jonovono 2011

@hexacyanide 추가에 대한 감사는 변경 사항이 정렬되지 않았기 때문에 귀찮았습니다
Eugen Sunic

33

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

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

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

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


14

당신이하려는 것은 불가능합니다. 그 이유는 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 스크립트를 호출 할 수 있습니다.

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


10

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

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.