用于创建新 shell 并在新 shell(而不是旧 shell)中执行新命令的脚本

用于创建新 shell 并在新 shell(而不是旧 shell)中执行新命令的脚本

我有一个常规的 shell csh 命令脚本,其结构如下。我想生成新终端并运行一些后续命令创建的新外壳。

xterm & ;
来源 myscript.scr;弗雷德;运行工具&

xterm & ;来源 myscript.scr; CD 账单;运行工具&

我正在名为 term1 的 csh 术语中运行我的脚本。所以第一部分是我想打开一个新的终端 term2 ,然后在这个新打开的终端 term2 中执行接下来的几个命令。然后,我还需要原始 term1 终端的另一个终端,并在这个新终端(例如 term3)中执行一些其他命令

我发现创建了新的终端 term2 ,但随后的命令在原始终端 term1 中执行,而不是在新终端 term2 中执行。

请您建议如何确保我的后续命令“转移”到新的 shell fof 中执行,还请注意我需要返回并发出一个新的终端。

答案1

使用:

xterm -e "myscript.scr; cd fred; run _tool" &
xterm -e "source myscript.scr; cd bull; run_tool" &

交换机-e会执行指定的命令之内会议xterm,而不是它,你的例子就是这样做的。

从手册页:

-e 程序 [ 参数 ... ]

该选项指定要在 xterm 窗口中运行的程序(及其命令行参数)。如果命令行上未给出 -T 和 -n,它还会将窗口标题和图标名称设置为正在执行的程序的基本名称。这必须是命令行上的最后一个选项。

答案2

我想你想要的是这样的

xterm &
(source myscript.scr; cd fred; run_tool ) & 

在这种情况下,第一个命令将在当前 shell 会话中运行并被推送到后台。第二个命令将在当前会话生成的新会话中运行,并且也会在后台运行。

但是,我对您在问题中使用“终端”与“shell”感到有点困惑。您是否正在尝试加载新的交互式终端窗口?或者只是运行命令而不影响当前的 shell 会话?

为了防止我的行为影响当前会话,我通常会这样做:

for my_dir in $some_list_of_dirs; do
    (
    cd "$my_dir"
    do stuff
    )
done

这样,您的工作目录不会在主会话中更改,只会在子会话中更改,并且您在子会话中对环境所做的任何更改都不会传播到主会话。

相关内容