【问题标题】:How to spawn a bash subshell from a bash script that persist after the script ends如何从脚本结束后仍然存在的 bash 脚本生成 bash 子shell
【发布时间】:2013-03-13 11:04:44
【问题描述】:

我想从一个 bash 脚本中生成一个 bash 子 shell,它允许我初始化环境变量并进行一些尝试,以便当脚本结束时,用户在具有初始化环境变量的子 shell 中。

通过测试,我发现如果我在脚本中有指令 /bin/bash ,则会生成子shell,并且当脚本结束时用户在子shell 中。如果我执行 exit,子 shell 终止,用户返回父 shell。

我现在希望能够根据脚本中给出的参数在子shell 中初始化环境变量并执行一些任务。

我怎样才能做到这一点?

【问题讨论】:

    标签: bash


    【解决方案1】:

    exec 就是你要找的东西

    $ cat reshell.sh
    #!/bin/bash
    export MY_ENVIRONMENT=foo
    chdir /home/bar
    exec $SHELL
    

    exec 将当前运行的脚本替换为继承了脚本环境的新 shell。这仍然是你运行它的那个的从属外壳,但它只有一层深;例如:

    $ pwd 
    /home/chmike
    $ ./reshell.sh
    $ pwd
    /home/bar
    $ exit
    $ pwd
    /home/chmike
    

    使用 exec $SHELL 而不是 exec /bin/bash 允许脚本调用用户首选的 shell,以防它不是 bash。

    【讨论】:

      【解决方案2】:

      导出脚本中的所有环境变量,然后生成一个子shell。 子shell 将设置所有环境变量。

      export EXAMPLE="<value>"
      ...
      #spawn a subshell
      /bin/bash
      

      【讨论】:

      • 这正是我想要避免的。我不想让环境变量使父 shell 混乱,我还需要执行一些脚本。调用初始化脚本作为 --init-file 参数就可以了。
      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多