답변:
예상되는 동작이며 이미 여러 번 논의되었습니다.
스크립트는 서브 쉘에서 실행되며 상위 쉘 작업 디렉토리를 변경할 수 없습니다. 완료되면 그 효과가 사라집니다.
디렉토리를 영구적으로 변경하려면 다음 과 같이 스크립트를 소싱 해야 합니다 .
. ./script
source ./script
같은?
.
과는 source
떠들썩한 파티에서와 동일하다. 2. ./
파일 이름이 같은 디렉토리에 있으면 파일 이름 앞에 사용할 필요가 없습니다 . 다음 만 실행해도됩니다.. script
이와 같은 작은 작업의 경우 스크립트를 만드는 대신 다음과 같은 별칭을 만드십시오.
$ alias cdproj='cd /dir/web/www/proj'
.bashrc
모든 대화식 쉘에 대해 설정하려면 파일에 추가해야합니다 .
이제 이것을 다음과 같이 실행할 수 있습니다 $ cdproj
.
eval `./script`
또는 eval $(./script)
해당 명령을 실행합니다. 이는 호출 쉘 환경을 업데이트해야하는 명령에 대한 일반적인 접근 방식입니다.
eval
접근 하려고하는 경우 출력하는 것에 매우주의하십시오 .
exec bash
마지막에bash 스크립트는 현재 환경 또는 하위 환경에서 작동하지만 상위 환경에서는 작동하지 않습니다.
그러나 다른 디렉토리에서 bash 스크립트를 실행 한 후 특정 디렉토리의 bash 프롬프트에 남아 있기를 원하기 때문에이 질문이 종종 제기됩니다 .
이 경우 스크립트 끝에서 자식 bash 인스턴스를 실행하십시오.
#!/usr/bin/env bash
cd desired/directory
exec bash
새로운 서브 쉘이 생성됩니다. exit
스크립트가 처음 시작된 첫 번째 쉘로 돌아가려면 입력하십시오 .
exec
것이
exit
(또는 Ctrl + D) 를 입력하여 세션을 완전히 종료하려고하면 11 ~ 21 번 수행해야합니다. (2) 실행 가능한 스크립트 사용의 또 다른 단점은 대화식 쉘 세션에서 쉘 옵션 (예 : dotglob
또는 globstar
) 을 설정 하면 새 쉘을 시작하기 때문에 옵션을 잃게된다는 것입니다.
왜 "exec"를 사용하지 않습니까?
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(또는 Ctrl + D) 를 입력하여 세션을 완전히 종료하려고하면 11 ~ 21 번 수행해야합니다.
dotglob
또는 globstar
)을 설정하면 새 쉘을 시작하기 때문에 옵션 을 잃게된다는 것입니다. … (계속)
함수를 사용하거나 &&를 사용하여이를 수행 할 수 있습니다. 다음 예제에서는 Zabbix를 설치하고 그 안에 줄이있는 파일을 만듭니다.
전의:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
또는:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
이 방법으로 공급 스크립트에서, 아니 탈출exit
- 그들은 쉘 기능처럼, 그리고exit
스크립트를 소스 쉘을 종료합니다.