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 $