2010-03-03 2 views
18

제목에서 알 수 있듯이 우리는 bash에서 (대부분의 경우) 호출되어야하는 유닉스 스타일의 쉘 유틸리티 U을 작성하고 있습니다.상위 프로세스의 작업 디렉토리를 어떻게 설정합니까?

정확히 U은 bash (또는 parent는 일반적으로)의 작업 디렉토리를 변경합니까?

P. 쉘 유틸리티 chdir은 똑같이하는 데 성공하므로, 효과를 얻기위한 프로그래밍 방식이 있어야합니다.

+0

참조 http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script – tripleee

답변

28

하지 마십시오.

FILE *p; 
char cmd[32]; 
p = fopen("/tmp/gdb_cmds", "w"); 
fprintf(p, "call chdir(\"..\")\ndetach\nquit\n"); 
fclose(p); 
sprintf(cmd, "gdb -p %d -batch -x /tmp/gdb_cmds", getppid()); 
system(cmd); 

그것은 것이다 아마 일, 강타의 pwd 명령 캐시 및 통지하지 않습니다하지만.

+10

+1 "do not do this" – Vlad

+0

Bash가 작업 디렉토리를 확인 (가능한 경우 수정)하도록하는 절차와 동일한 방식으로 호출 할 수 있습니까? – user285728

+0

@coderodde Bash 소스 코드를 살펴보면,'chdir ("..") 다음의'resetpwd ("")'가 캐쉬 된 pwd를 처리한다는 것은 명백합니다. 하지만 "하지마"라고 읽지 않았 니? 진지하게,하지 마라. – ephemient

6

부모 프로세스의 현재 디렉터리에 영향을주는 "합법적 인"방법이 없으며 부모 프로세스가 스스로 변경하도록 요청하는 것 외에는 없습니다.

chdir bash 스크립트에서 디렉토리를 변경하는 것은 외부 유틸리티가 아니며 내장 명령입니다.

3

chdir 명령은 내장 된 쉘이므로이를 실행하는 쉘의 작업 디렉토리에 직접 액세스 할 수 있습니다. 쉘은 일반적으로 쉘의 작업 환경에서 복사본을 처리하도록 스크립트의 효과로부터 스스로를 보호하는 데 매우 효과적입니다. 하위 프로세스가 종료되면 사용 된 환경이 삭제됩니다.

당신이 할 수있는 한 가지 일은 '소스'스크립트입니다. 기본적으로 직접 입력 한 것처럼 쉘에서 파일의 명령을 실행하도록 지정하기 때문에 디렉토리를 변경할 수 있습니다. 즉, 쉘 환경의 복사본을 사용하지 않고 있습니다. 소싱 할 때 직접 작업하고 있습니다. 경우

1

당신은 대화 형 쉘을 실행하고 대상 디렉토리가 정적 인, 당신은 단순히 당신의 ~/.bashrc 파일에 별명을 넣을 수 있습니다 :

alias cdfoo='cd theFooDir' 

비 대화 형 쉘 스크립트를 처리, 당신은을 만들 수 있습니다 parental Bash 스크립트와 자식 Bash 스크립트 사이의 프로토콜. 이를 구현하는 한 가지 방법은 하위 스크립트가 경로를 파일 (예 : ~/.new-work-dir)에 저장하도록하는 것입니다. 자식 프로세스가 종료되면 부모 프로세스에서이 파일을 읽어야합니다 (예 : cd `cat ~/.new-work-dir`).

이전 단락에서 언급 한 규칙을 자주 사용하려는 경우 Bash 소스 코드를 다운로드하고 명령을 실행할 때마다 작업 디렉토리를 ~/.new-work-dir의 내용으로 자동 변경하도록 패치 할 것을 제안합니다. . 이 패치에서는 필요에 따라 완전히 새로운 Bash 기본 제공 명령을 구현할 수도 있습니다.이 명령은 구현하고자하는 프로토콜을 구현합니다 (이 새로운 명령은 Bash 유지 보수자가 수락하지 못할 것입니다). 그러나 패치는 개인적인 용도로 사용하거나 소규모 커뮤니티에서 사용할 수 있습니다.

3

길은 I solved this입니다.이 방법은 스크립트를 호출하고 스크립트에서 작성한 파일의 원본을 가져 오는 셸 별칭을 사용하는 것입니다.그래서, 예를 들어,

function waypoint { 
    python "$WAYPOINT_DIRECTORY"/waypoint.py [email protected] && 
    source ~/.config/waypoint/scratch.sh 
    cat /dev/null > ~/.config/waypoint/scratch.sh 
} 

waypoint.py

cd /some/directory 

이 여전히 나쁜 일처럼 보이도록 scratch.sh을 만듭니다.

4

정확하게 bash (또는 부모)의 작업 디렉토리를 정확히 바꿀 수 있습니까?

"허용 가능한"방법을 사용하면 이 아닌이 가능합니다. 허용함으로써, 나는 "포악하게 시스템을 해킹하지 않고 (GDB 예를 들어 사용)"을 의미하며 사용자가 실행 파일을 실행하면, 더 심각하게)

을, 자식 프로세스 인의 자신의 환경에서 실행됩니다 주로 부모 환경의 복사본입니다. 이 환경에는 "환경 변수"와 "현재 작업 디렉토리"가 포함되어 있습니다.

물론 프로세스는 자신의 자신의 환경을 변경할 수 있습니다. 예를 들어 작업 디렉토리를 변경하려면 (예 : cd xxx 셸). 그러나이 환경은 복사본이므로 부모 환경을 변경하지는 않습니다. 부모 환경을 수정하는 표준 방법은 없습니다. cd는 ("CHDIR는")는 내부 쉘 명령 아닌 외부 유틸리티 이유 사이드 참고로


이있다. 이 경우 쉘의 작업 디렉토리를 변경할 수 없습니다.

관련 문제