将命令排队到最后一个 subshel​​,即使其中一个启动了新的 shell

将命令排队到最后一个 subshel​​,即使其中一个启动了新的 shell

我想编写一些简单的脚本来自动执行一些连续启动几个脚本的操作。然后在顶层 shell 中设置一些别名。
问题:这些命令中的几个会启动新的 shell。而该命令之后的所有命令都在前一个 shell 中启动。有没有办法将这些命令排在“顶层”shell 中的命令之后?
简单示例:

#!/usr/bin/ksh
#normally this ksh is executed deep inside other script i cannot modify
ksh
echo test

有没有办法在刚通过 ksh 命令启动的 shell 上打印“test”?通常 test 打印在前一个 shell 中 - 在“exit”命令后可用 感谢您的帮助。

答案1

有四种替代方案,但每种方案都有缺点:

  1. 确保要在 ksh 中执行的命令已写入文件mycmds并以以下形式启动 ksh:

    cat mycmds /dev/tty | ksh -i
    

    退税:您将失去 ksh 的命令行编辑功能。

  2. 确保您要在 ksh 中执行的命令已写入文件;在启动之前/tmp/mycmds$$将环境变量设置MYCMDS为;并将以下内容添加到您的:/tmp/mycmds$$ksh -l$HOME/.profile

    if [ -n "$MYCMDS" ] ; then
        . "$MYCMDS"
        MYCMDS=
        export MYCMDS
    fi
    

    退税:每一个使用这个程序的人都必须修改他的$HOME/.profile

  3. 将整个过程组织起来,将要执行的命令写入一个文件mycmds,然后. mycmds通过最初的shell. 将所有这些放入函数定义中。

    退税:您无需启动新 shell,只需修改初始 shell 的环境和/或别名定义即可。使用此程序的每个人都必须使用 ksh。

  4. 确保要执行的命令已写入文件mycmds并启动狂欢形式如下:

    bash -i --init-file mycmds
    

    退税:您得到的是 bash 而不是 ksh。

相关内容