我有一个常规的 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
这样,您的工作目录不会在主会话中更改,只会在子会话中更改,并且您在子会话中对环境所做的任何更改都不会传播到主会话。