无法使用包含exit命令的bash脚本从docker容器中退出

无法使用包含exit命令的bash脚本从docker容器中退出,bash,docker,Bash,Docker,在容器环境中输入exit命令时,我可以退出。但是,如果我尝试使用exit命令运行脚本文件,则无法从容器中退出 1.工作 ubuntu@iot-docker:/repo$ exit exit root@iot-docker:/repo# exit exit ubuntu@ubuntu-***-Twr:~/shirisha/plo-***-snt-sp_u103a3$ 不起作用 当您编写脚本而不“源”脚本时,脚本将在新的子流程中启动。退出有效,您将完成该子流程。 重要的是要记住,脚本启动

在容器环境中输入
exit
命令时,我可以退出。但是,如果我尝试使用
exit
命令运行脚本文件,则无法从容器中退出

1.工作

ubuntu@iot-docker:/repo$ exit
exit
 
root@iot-docker:/repo# exit
exit

ubuntu@ubuntu-***-Twr:~/shirisha/plo-***-snt-sp_u103a3$ 

  • 不起作用

  • 当您编写脚本而不“源”脚本时,脚本将在新的子流程中启动。
    退出
    有效,您将完成该子流程。
    重要的是要记住,脚本启动了一个新的环境

    请看脚本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
    (或short
    。/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解释器

    运行脚本时,将根据脚本的第一行启动一个新的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已不存在。

    您实际希望它做什么<代码>退出退出脚本。希望通过执行“script.sh”从容器中退出ubuntu@iot-docker:/repo$cat script.sh#/bin/bash退出ubuntu@iot-docker:/repo$./script.shubuntu@iot-码头工人:/repo$ubuntu@iot-码头工人:/repo$预期-ubuntu@ubuntu--Twr:~/shirisha/plo--snt-sp_u103a3$如何调用script.sh?从一个合成文件?从
    docker exec
    命令?直接通过容器内的命令行?谢谢@Xiennei必须运行“exec script.sh”两次才能退出容器。有什么办法可以让我运行一次吗?我不明白怎么可能,特别是因为在你的问题中,只有一次手动退出是必要的。如果您必须运行它两次,那么这意味着您有一个shell解释器,它已经运行了另一个shell解释器。你没有像在我的实验中那样给bash打电话,是吗?(这只是一个实验)为了启动docker,使用了yocto_build.sh文件(它有docker run命令)。试图从docker容器中退出,而不是两次输入“exit”命令以退出容器,在script.sh中添加了两次exit命令并尝试执行。@shirisha如果我理解正确,您必须手动输入两次
    exit
    才能退出shell?这是你的问题所显示的吗?在您的问题中,对于非特权用户(
    $
    提示符),一个出口似乎是退出
    su
    sudo
    shell。第二个用于退出root的主shell(
    #
    提示符)。如果您的问题是正确的,那么您似乎有执行非特权shell的东西。我几乎帮不上什么忙,因为这与您的安装有关。
    exec script.sh param1 ... paramN