
나는 단지 스크립트를 작성하고 싶습니다.내 디렉토리를 변경해.
아래 명령을 파일에 넣었습니다./home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
내가 그랬어
chmod +x pathABC
터미널에서 을 /home/alex
실행했지만 ./pathABC
출력은 그대로 HelloWorld
이고 현재 디렉터리는 변경되지 않았습니다.
그렇다면 무엇이 잘못되었나요?
답변1
다른 사람들이 설명했듯이 디렉토리는 스크립트가 호출되는 터미널 프로세스가 아니라 스크립트의 하위 프로세스에서 변경됩니다. 하위 프로세스가 종료되면 원래 있던 자리에 남아 있던 터미널로 돌아갑니다.
여러 가지 대안:
1. 심볼릭 링크
집에 쉽게 액세스하려는 긴 경로에 대한 심볼릭 링크를 추가하세요.
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
그런 다음 다음을 사용하여 디렉토리에 액세스하십시오.
$ cd ~/pathABC
2. 별칭
~/.bashrc에 별칭을 추가하세요.
alias pathABC="cd /home/alex/Documents/A/B/C"
(에서여기)
3. 기능
디렉터리를 변경하는 함수를 만듭니다. 이 함수는 터미널 프로세스에서 실행되고 디렉터리를 변경할 수 있습니다.
(에서여기)
4. 어린아이처럼 달리는 것을 피하세요
스크립트를 실행하는 대신 소스를 제공하세요. 소싱( .
또는 에 의해 수행 source
)으로 인해 스크립트가 자체 하위 쉘에서 실행되는 대신 동일한 쉘에서 실행됩니다.
$ . ./pathABC
5. CD 가능 변수
cdable_vars
옵션을 설정 ~/.bashrc
하고 디렉터리에 환경 변수를 만듭니다.
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
그런 다음 사용할 수 있습니다cd pathABC
(에서여기)
답변2
터미널에서 스크립트를 실행하면 하위 프로세스가 실행됩니다. 이 하위 프로그램에서는 스크립트가 지정된 디렉토리로 변경됩니다. 그러나 상위 프로세스, 즉 스크립트를 실행하는 위치는 여전히 이전 경로에 있습니다. 또는 간단히 다음과 같이 말할 수 있습니다.
cd 명령의 범위는 상위 프로세스가 아닌 하위 프로세스에만 적용됩니다.
답변3
당신은 생각 오류를 범하고 있습니다. 현재껍데기같은 디렉토리에 머물며,스크립트새 디렉토리로 이동했습니다.
다음에서 다른 스크립트를 생성하면 이를 확인할 수 있습니다.새로운디렉터리를 변경한 후 스크립트에서 실행합니다.
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
두 번째 스크립트는 새 디렉터리에서 실행됩니다.
HelloWorld
단지 스크립트의 출력일 뿐입니다.
답변4
$SHELL
마지막에 사용
Bash 스크립트는 현재 환경이나 하위 환경에서 작동하지만 상위 환경에서는 작동하지 않습니다.
그러나 이 질문은 종종 누군가가 원하기 때문에 묻는다.실행 후 특정 디렉터리의 명령 프롬프트에 남게 됩니다.다른 디렉토리 내의 스크립트.
이런 경우 간단히하위 $SHELL
인스턴스 실행스크립트 끝에서:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
이전 상위 셸 인스턴스로 돌아가려면 Ctrl+ 를 사용하세요 D.