스크립트에서 쉘을 변경하는 방법

스크립트에서 쉘을 변경하는 방법

쉘을 ksh에서 bash로 변경하고 파일을 얻고 싶습니다 .kshrc. 다음 명령줄을 순서대로 실행하고 싶습니다.

bash
. ~/.kshrc
clear 

누구든지 나를 도와줄 수 있나요?

답변1

먼저 대화형으로 수행한 다음 스크립트에서 수행해 보겠습니다. kshrc 파일의 첫 번째 줄이 그렇지 않거나 그와 유사한 경우 #~/usr/bin/env ksh질문 #!/usr/bin/ksh에 입력한 내용은 대화식으로 작동합니다. 그래서 나는 kshrc 파일의 첫 번째 줄을 건너뛰고 파일의 나머지 부분을 실행하려고 한다고 가정합니다.

예를 들어 다음이 $HOME/.kshrc의 전체 내용이라고 가정합니다.

#!/usr/bin/env ksh
# this is my kshrc file
KSH_RED="\033[1;31m"
KSH_RESET="\033[00m"
KSH_SENTINEL="${KSH_RED}Hello from KSHRC${KSH_RESET}"

센티넬 변수를 사용하여 파일이 실행되는지 여부를 나타낼 수 있습니다. 숨은 코드를 사용하려면 위 명령을 $HOME/.kshrc 파일에 추가해야 할 수도 있습니다. 또는 위 명령을 kshrc2 파일에 배치하고 코드 숨김을 적절하게 수정할 수도 있습니다.

$HOME/.kshrc에 위 명령이 있다고 가정하고 새 Korn 쉘을 시작하십시오. Korn 쉘에서 다음 명령을 대화식으로 시도해 보겠습니다.

echo $KSH_SENTINEL
KSH_SENTINEL=""
echo $KSH_SENTINEL

tail -n +2 $HOME/.kshrc > /tmp/kshrc.bash
bash
. /tmp/kshrc.bash
rm /tmp/kshrc.bash
echo $KSH_SENTINEL

위의 내용은 kshrc 세트에 환경 변수 KSH_SENTINEL을 사용하여 대화형 Bourne-again 쉘에 남게 됩니다. 또한 우리가 원하지 않는 bashrc 파일 세트의 환경 변수도 있습니다. Korn 쉘 프롬프트에서 다음 명령을 실행하면 bashrc 대신 /tmp/kshrc.bash 파일을 사용하여 Bourne-again 쉘에 들어갈 수 있습니다:

KSH_SENTINEL=""
tail -n +2 $HOME/.kshrc > /tmp/kshrc.bash
echo "rm -f /tmp/kshrc" >> /tmp/kshrc.bash
bash -rcfile /tmp/kshrc.bash
echo $KSH_SENTINEL

지금까지 우리는 대화형 Bourne-again 쉘에 들어가서 매우 간단한 kshrc 파일을 기반으로 환경을 설정할 수 있었습니다. 우리는 임시 파일 /tmp/kshrc.bash를 사용하여 이 작업을 수행하는데, 이 파일은 처음 얻을 때 삭제됩니다.

물론 bash는 더 복잡한 kshrc 파일의 일부 ksh 구문이나 명령으로 인해 정체될 수 있습니다. 그러나 환경 변수를 설정하고 kshrc 파일에 별칭을 생성하면 지금까지 수행한 작업을 사용할 수 있습니다. kshrc의 bash 호환 부분만 실행해야 하는 경우 주석을 사용하여 이러한 부분을 설명할 수 있습니다. 그런 다음 awk 또는 다른 것을 사용하여 이러한 부분을 /tmp/kshrc.bash 파일에 복사할 수 있습니다.

이제 이러한 개념을 사용하는 Korn 쉘 스크립트를 작성해 보겠습니다(원래 질문과 동일). 스크립트는 Korn 쉘에서 시작하여 kshrc 파일에서 명령을 추출하고 bash 명령을 추가하고 kshrc+bash 명령을 실행한 다음 Korn 쉘로 돌아갑니다. 이 ksh 스크립트를 "bash_my_korn.ksh"라고 부르겠습니다. 이것은 버전입니다

#!/usr/bin/env ksh

#
# Say hello with the print command (ksh only)
print "Hello from $0"

#
# Set a variable for the temporary file
TMP_FILE="/tmp/kshrc.bash"

#
# Unset the sentinel
KSH_SENTINEL=""
print "Korn sentinel is $KSH_SENTINEL"

#
# Assemble the bash script in 2 sections
# Section 1:

print "#!/usr/bin/env bash" > $TMP_FILE
tail -n +2 $HOME/.kshrc >> $TMP_FILE

#
# Section 2 is the bash commands that we want to
# execute after the kshrc commands are executed
cat >> $TMP_FILE <<-EOS

echo "Hello from the Bourne-again shell"

if [[ -z "\$KSH_SENTINEL" ]] ; then
    echo "Bash can NOT see the sentinel variable"
else
    echo -e "Bash can see sentinel \$KSH_SENTINEL"
fi
print "Bash shell does not know the print command"

echo "Goodbye from Bourne-again shell"
EOS

#
# The bash command file now exits.  There are several ways to execute it.
print
print "Method 1, without the bashrc file"
bash --norc $TMP_FILE

print
print "Method 2, requires the script be executable"
chmod u+x $TMP_FILE
$TMP_FILE           # the bash command is on the first line of the script

#
# Now finish the Korn shell script
print
print "Goodbye from $0"

#
# Clean up ?
rm -f $TMP_FILE

위 스크립트의 주석이 이를 설명해주기를 바랍니다. 아이디어는 kshrc 명령과 bash 명령을 포함하는 단일 bash 스크립트를 조합한 다음 간단히 스크립트를 실행하는 것입니다. 예제 ksh 스크립트에는 여러 인쇄 명령이 포함되어 있어 어떤 부분이 실행되고 있는지 확인할 수 있습니다. 스크립트는 자체적으로 삭제할 수 있지만 해당 스크립트를 만든 Korn 쉘에서도 스크립트를 삭제하도록 하는 것이 가장 좋습니다.

몇 가지 의견을 말씀드리겠습니다. 먼저, --norc일반적인 bashrc 파일 실행을 피하기 위해 옵션을 사용하여 bash를 시작할 수 있습니다. 둘째, catbash 스크립트에 명령을 추가할 수 있지만 bash 명령에 환경 변수가 포함된 경우 위에서 했던 것처럼 Korn 셸이 변수를 확장하지 못하도록 달러 기호 앞에 백슬래시를 넣어야 합니다. 셋째, 이 데모는 자신만의 솔루션 개발을 시작하는 데 도움이 되는 개념 증명으로 간주되어야 합니다.

관련 정보