Bash 스크립트의 CD에는 별칭, 함수, 소스 코드가 없습니다.

Bash 스크립트의 CD에는 별칭, 함수, 소스 코드가 없습니다.

cd디렉토리에 배치 해야 하는 bash 스크립트를 작성했습니다 .

내 문제는 서브쉘의 디렉토리만 변경된다는 것입니다.

비슷한 질문을 많이 읽었지만 해결책이 있는지 알고 싶습니다.와는 별개로별칭, 함수를 사용하거나 스크립트를 가져옵니다.

무슨 말인지 모르신다면 다음 예를 들어보세요.

user@linux ~: cat ./myscript.sh
#!/bin/bash
cd /any/directory
user@linux ~: ./myscript.sh
user@linux ~: 

내 스크립트는많은더 이상 기능을 사용하고 싶지 않습니다!

답변1

현재 셸에서 cd ​​명령을 적용하려면 하위 셸의 변경 사항이 상위 셸로 다시 전파되지 않으므로 현재 셸에서 스크립트를 실행해야 합니다.

      $ pwd
      /afs/user/i/ahmad
      $ cat test1
        #!/bin/bash
        cd /etc
      $ . test1           #runs test1 in current shell even if its not executable
      $ pwd
      /etc

echo와 eval을 사용하세요.

상위 쉘에서 eval을 사용하십시오. 쉘 스크립트 echo 명령에서 상위 쉘로 실행하려는 명령은 다음과 같습니다.

echo "cd $filepath"

상위 셸에서 eval을 사용하여 셸 스크립트를 시작할 수 있습니다.

  eval `sh foo.sh`

예:

  $ cat test1.sh 
   #!/bin/bash
   echo "cd /etc"

  $ eval `sh test1.sh`
  $ pwd
  /etc

답변2

스크립트를 실행하면 자체 매개변수, 함수 등을 사용하여 별도의 프로세스가 시작됩니다. 프로세스는 상위 셸에서 환경을 상속 받지만 서로 다른 존재입니다. cd다른 프로세스 내에서 실행 중인 프로세스 내에서 다른 명령을 보낼 수 있는 것과 같은 방식으로 하위 셸 내의 상위 셸 위치에서는 이 작업을 수행 할 수 없습니다 . 즉, 이런 마법은 없다

command "run in process 123456"

이제 실행할 프로세스에 명령을 보낼 수는 없지만 실제로는 보낼 수 있습니다.신호명령을 사용하여 프로세스에 kill. 따라서 이러한 상황에 대비하여 상위 셸을 미리 준비하면 trap신호를 보내고 일부 명령을 실행할 수 있습니다.

다음은 최소한의 예입니다.

/home/jimmij $ trap 'cd /tmp' INT
/home/jimmij $ cat myscript.sh
#!/bin/bash
echo Changing parent directory
kill -s SIGINT $PPID

/home/jimmij $ ./myscript.sh
Changing parent directory

/tmp $

관련 정보