使用Shell脚本打开带有多个选项卡的终端

3

我是一名新手,想要编写一个能够打开带有多个选项卡的终端的shell脚本。每个选项卡中应该运行一个rtsp客户端程序。

我已经编写了如下代码:

tab="--tab-with-profile=Default -e "
cmd="java RunRTSPClient"
for i in 1 2 3 4 5
   do
#   
   foo="$foo $tab $cmd"         
   done
gnome-terminal $foo
exit 0

它正在正常执行,但是会打开终端并立即关闭。(我没有得到错误信息) 如果我用gnome-terminal --tab -e $cmd替换foo=...这一行,那么它就能够正常工作,但会打开独立的终端。

请建议如何修复这个问题。

谢谢


1
我认为你不想要一个带有多个 --tab 参数的 gnome-terminal; 相反,你想要多个 gnome-terminal --tab 调用。 - trojanfoe
我读过一篇博客,说把所有命令放在一个字符串中,并将其提供给gnome-terminal。它会打开选项卡并运行应用程序。这就是为什么我正在尝试这个方法。我需要打开100多个选项卡进行测试。多次编写--tab -e不是一个好方法。 - user1241903
1
啊,你可能是对的,但我认为按照我的建议做不会对性能产生太大影响。至少试一试吧。 - trojanfoe
1
哦,亲爱的;那让我试着回答一下吧。 - trojanfoe
@CharlesDuffy:gnome-terminal未包含在foo中。只有参数包含在foo中。(根据他的代码)即使您一小时前回答要引用作为“-e”下一个参数给出的命令。 - anishsane
显示剩余10条评论
1个回答

5

在bash中,构建参数列表时应始终(总是!)使用数组。

也就是说:

#!/bin/bash
#    ^^ this has to be bash, not /bin/sh, for arrays to work
cmd=( gnome-terminal )
for ((i=0; i<5; i++)); do
  cmd+=( --tab-with-profile=Default -e "java RunRTSPClient" )
done
"${cmd[@]}"

这将为您提供运行以下命令的确切等效结果:
gnome-terminal \
  --tab-with-profile=Default -e "java RunRTSPClient" \
  --tab-with-profile=Default -e "java RunRTSPClient" \
  --tab-with-profile=Default -e "java RunRTSPClient" \
  --tab-with-profile=Default -e "java RunRTSPClient" \
  --tab-with-profile=Default -e "java RunRTSPClient"

我理解您想要的是什么。

尝试在字符串中构建复杂命令会导致非常糟糕的结果;请阅读http://mywiki.wooledge.org/BashFAQ/050以了解原因。


1
它正在工作,但是什么修复了窗口立即关闭的问题?可以解释一下吗?还有"${cmd[@]}"是什么意思?谢谢。 - user1241903
@user1241903,“立即关闭窗口”问题是一个gnome-terminal问题,而不是bash问题。请与声称可以以这种方式使用gnome-terminal的博客文章的作者联系。"${cmd[@]}"扩展为数组cmd中的条目列表,而不以任何方式更改这些条目之间的边界。在这种情况下,cmd数组包含您想要运行的gnome-terminal命令。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接