运行脚本时 Shell 终止。为什么?

运行脚本时 Shell 终止。为什么?

我正在家里运行我在网上找到的以下脚本,每次执行时,当我提供读取提示的答案时,shell 就会终止。当我在 bg 中运行脚本时,收到以下消息:Bash:[answer]:找不到命令。为什么会发生这种情况?我通常从脚本所使用的目录运行它.

编辑:我运行了脚本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

这与你的答案几乎相同关于超级用户的其他相同问题

.当您使用(或)运行 shell 脚本时,source您将在交互式 shell 的上下文中运行它。因此,当 shell 执行exit命令时,它会退出交互式 shell。

运行 shell 脚本的正确方法不是使用.(或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

我可能应该指出,以这种方式运行脚本时,不可能在当前的交互式 shell 中设置环境变量。要做到这一点您确实需要继续使用.or source,在这种情况下您必须记住,因为脚本在您的交互式上下文中运行一定不在任何地方都包含一个exit声明。

相关内容