我正在家里运行我在网上找到的以下脚本,每次执行时,当我提供读取提示的答案时,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
声明。