스크립트를 실행하면 쉘이 종료됩니다. 왜? [폐쇄]

스크립트를 실행하면 쉘이 종료됩니다. 왜? [폐쇄]

저는 집에서 온라인으로 찾은 다음 스크립트를 실행하고 있는데, 실행할 때마다 읽기 프롬프트에 응답을 제공하면 셸이 종료됩니다. bg에서 스크립트를 실행하면 다음 메시지가 나타납니다. Bash: [답변]: 명령을 찾을 수 없습니다. 왜 이런 일이 발생합니까? 나는 보통 스크립트가 사용하는 디렉토리에서 실행합니다..

편집: 스크립트를 실행했는데 bash예상대로 작동했습니다. 왜 그런 차이가 있는지 설명할 수 있는 사람이 있나요?

#!/bin/bash

echo "Enter 1 or 2, to set the environmental variable EVAR to Yes or No"
read ans

# Set up a return code
RC=0

if [ $ans -eq 1 ]  
then 
    export EVAR="Yes"
else
    if [ $ans -eq 2 ]
    then
    export EVAR="No"
    else
# can only reach here with a bad answer
    export EVAR="Unknown"
    RC=1
    fi    
fi
echo "The value of EVAR is: $EVAR"
exit $RC

답변1

답변하신 내용과 거의 같습니다슈퍼유저에 대한 다른 동일한 질문.

.(또는)을 사용하여 쉘 스크립트를 실행하면 source대화형 쉘의 컨텍스트에서 실행됩니다. 따라서 쉘이 exit명령을 실행하면 대화형 쉘이 종료됩니다.

쉘 스크립트를 실행하는 올바른 방법은 .(또는 source)을 사용하는 것이 아니라 실행 가능하게 만든 다음 다른 응용 프로그램처럼 실행하는 것입니다. (첫 번째 줄은 으로 시작하고 #!스크립트의 인터프리터를 정의합니다. 제 예에서는 그렇습니다만 /bin/bash스크립트를 읽을 수 있는 모든 것이 될 수 있습니다.)

다음은 다음과 같은 스크립트의 실제 예입니다 tryit.

# Create a trivial shell script called "tryit"
cat >tryit <<'X'
#!/bin/bash
echo "This is my shell script"
exit 0
X

# Make it executable
chmod +x tryit

# Now run it (the "./" prefix means "in the current directory")
./tryit

tryit스크립트를 디렉터리에 넣으면 접두사 $PATH는 필요하지 않습니다(사용해서는 안 됩니다) ./. 이것은 예이다

# Create applications (bin) directory and add to PATH for this session
mkdir -p "$HOME/bin"
export PATH="$HOME/bin:$PATH"

# Move the "tryit" application to the bin directory
mv tryit "$HOME/bin"

# Now we can run it just like any other application
tryit

이런 방식으로 스크립트를 실행할 때는 현재 대화형 셸에서 환경 변수를 설정할 수 없다는 점을 지적하고 싶습니다.이것을 할 수 있어야 해.또는 을 계속 사용해야 합니다 source. 이 경우 스크립트가 대화형 컨텍스트에서 실행되기 때문에 기억해야 합니다.기필코 아니다어디에든 성명을 포함시키세요 exit.

관련 정보