노드 스크립트를 실행할 때 현재 셸 컨텍스트에서 작업 디렉터리 변경
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'
노드 프로세스를 실행하는 기본 셸의 CWD를 변경하는 노드의 기본 제공 방법은 없습니다.
명령을 통해 노드 프로세스의 현재 작업 디렉터리를 변경할 수 있습니다.
var process = require('process');
process.chdir('../');
노드 프로세스가 존재하면 프로세스를 시작한 CWD로 돌아갑니다.
당신이 하려는 일은 불가능합니다.그 이유는 POSIX 시스템(Linux, OSX 등)에서 자식 프로세스가 부모 프로세스의 환경을 수정할 수 없기 때문입니다.여기에는 상위 프로세스의 작업 디렉터리 및 환경 변수 수정이 포함됩니다.
명령줄에서 노드 스크립트를 실행할 때 현재 프로세스(bash
,zsh
why)는 자체 환경을 가진 새 프로세스를 생성합니다. 일반적으로 현재 환경의 복사본(시스템 호출을 통해 변경할 수 있지만 이는 응답 범위를 벗어남). 이 프로세스는 필요한 작업을 완전히 격리하여 수행할 수 있습니다.하위 프로세스가 종료되면 환경에 영향을 미치지 않는 셸의 프로세스로 제어 권한이 반환됩니다.
여기에는 여러 가지 이유가 있지만, 우선 백그라운드에서 스크립트를 실행했다고 가정해 보십시오../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'자를 써야 하고, 그리고...
- 기존 후에는 모든 변경 내용이 실행 취소됩니다.
하지만, 저에게는 그 차이가 바람직합니다.
이 코드를 사용해 보십시오.
const dirPath = path.join(__dirname, foldername);
process.chdir(dirPath);
사용할 수 있습니다.process.chdir
.
그process.chdir()
하거나 이 실패할 를 들어, 된 method가 Node.js와 동일한 경우).directory
존재하지 않음).문서 링크: https://nodejs.org/api/process.html#processchdirdirectory
import { chdir, cwd } from 'node:process';
console.log(`Starting directory: ${cwd()}`);
try {
chdir('/tmp');
console.log(`New directory: ${cwd()}`);
} catch (err) {
console.error(`chdir: ${err}`);
}
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');
언급URL : https://stackoverflow.com/questions/19803748/change-working-directory-in-my-current-shell-context-when-running-node-script
'programing' 카테고리의 다른 글
오라클 11g 또는 12c에서 테이블/열/인덱스 이름 크기 변경 (0) | 2023.09.05 |
---|---|
존재하는 경우, 다른 삽입을 선택한 다음 선택 (0) | 2023.09.05 |
Selenium WebDriver - 요소를 클릭할 수 있는지 여부를 확인합니다(즉, Dojo 모달 라이트 박스에 의해 가려지지 않음). (0) | 2023.08.31 |
*ngFor에서 동적 ID를 설정하는 방법은 무엇입니까? (0) | 2023.08.31 |
MySQL에서 "ADD KEY"와 "ADD INDEX"의 차이점은 무엇입니까? (0) | 2023.08.31 |