在容器环境下输入
exit
命令就可以退出。但是,如果我尝试运行具有 exit
命令的脚本文件,我将无法从容器中退出。
1.工作
ubuntu@iot-docker:/repo$ exit
exit
root@iot-docker:/repo# exit
exit
ubuntu@ubuntu-***-Twr:~/shirisha/plo-***-snt-sp_u103a3$
script.sh
#!/bin/bash
exit
exit
exit
不是退出容器的命令,它只是退出当前的 shell 解释器。
当您运行脚本时,将根据脚本的第一行启动一个新的 shell 解释器(此处为
/bin/bash
)。当遇到 exit
命令时,解释器将停止,您将返回到命令行(前一个 shell)。
你可以做这个实验:
$ bash # Starts a new shell
$ exit # Exits the new shell; we come back to the old one
exit
$
看到了吗?在命令行中运行
bash
与运行脚本类似,退出它会让您返回到之前的 shell。您没有退出容器。
解决方案:
exec script.sh param1 ... paramN
exec
将用正在启动的命令替换当前的 shell (script.sh
)。当该命令退出时,您将退出容器,因为旧的 shell 不再存在。
当您在没有“采购”脚本的情况下编写脚本时,该脚本将在新的子进程中启动。
exit
有效,您将完成该子流程。查看脚本example.sh
#!/bin/bash
my_value=high
cd /tmp
用
调用此脚本cd $HOME
my_value="low"
./example.sh
pwd
echo "My value is now ${my_value}"
现在什么都没有改变:子流程中的所有更改都消失了。
您可以使用
source ./example.sh
(或短 . ./example.sh
)调用此脚本,
事情已经改变了。
当您不想获取脚本来源时,函数(
.bashrc
中)可能会有所帮助:
example() {
my_value=high
cd /tmp
}
现在你可以调用该函数了:
cd $HOME
my_value="low"
example
pwd
echo "My value is now ${my_value}"
有人找到答案了吗?
我也有类似的需求。如果用户输入不正确的密码,我想退出容器本身。我有一个脚本,运行时会提示输入密码。如果用户输入的密码不正确,那么我想退出容器。仅使用
exit
命令,它只会退出 shell 解释器,而不会退出容器。我也尝试过终止进程,但它也不起作用。