쉘 스크립트에서 사용자 기본 쉘 실행

쉘 스크립트에서 사용자 기본 쉘 실행

쉘 스크립트에서 사용자 쉘을 실행하고 쉘이 완료된 후 스크립트를 계속 실행하고 싶습니다.

다음과 같아야 합니다.

> myScript.sh
Script ouput
> echo "shell started by myScript.sh"
shell started by myScript.sh
> exit
More script output
>

스크립트에서 셸을 실행할 때 작동합니다.

echo "Script output"
bash
echo "More script output"

하지만 고정 쉘을 사용하지 않기를 바랍니다. 사용자의 로그인 셸이나 myScript.sh를 시작하기 전의 셸은 문제가 없습니다.

모든 솔루션은 Linux 기반 시스템뿐만 아니라 Mac OSX에서도 작동해야 합니다.

답변1

$SHELL환경 변수를 사용할 수 있습니다 (설정된 경우).

echo "Script output"
"${SHELL-bash}"
echo "More script output"

이 경우 설정되지 않은 경우 코드가 호출됩니다 bash.

유효한 실행 파일을 가리키는지 확인하지 않았습니다. 누군가가 그것을 조작하면 다른 응용 프로그램에도 영향을 미칠 것이라고 가정했지만 전체 경로여야 하기 때문에 이러한 유형의 접근 방식을 사용할 수 있습니다. 시험)

[ -n "$SHELL" ] && [ -x "$SHELL" ] || SHELL=
"${SHELL-bash}"

답변2

초기 로그인 쉘은 passwd 데이터베이스에 저장되어 있으므로 을(를) 따라갈 수 있습니다 $(getent passwd myusername | cut -d: -f7). 일반적으로 a를 사용하고 있지만 zsh현재 a에 있는 경우 bash이를 실행하면 a zsh대신 a가 표시됩니다 bash. 이는 원하는 것일 수도 있고 아닐 수도 있습니다.

답변3

환경 변수는 $$현재 PID를 나타냅니다. 이것을 "ps"와 함께 사용하여 현재 쉘을 찾을 수 있습니다:

ps --no-header -o args -p $$ | cut -d- -f2

위의 내용은 존재할 수 있는 모든 선행 작업을 잘라내어 원하는 것을 반환해야 합니다. 예를 들어:

THESHELL=`ps --no-header -o args -p "$$" | cut -d- -f2`
start_another_shell() {
    "$THESHELL"
}
echo "The shell is $THESHELL"
start_another_shell
echo "Bye!"

실수로 포크 폭격을 당하는 것을 방지하려면 "소스"를 사용하여 실행하십시오. 예를 들어:

me@here$ source myScript
The shell is bash
me@here$ exit
Bye!
$ zsh
$ source myScript
The shell is zsh
$ exit
Bye!

관련 정보