スクリプトを実行すると、シェルが終了します。なぜ? [閉鎖]

スクリプトを実行すると、シェルが終了します。なぜ? [閉鎖]

私は家でオンラインで見つけてスクリプトを実行していますが、実行するたびに読み取りプロンプトに応答を提供するとシェルが終了します。 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

関連情報