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