在循环中使用复杂命令打开多个gnome终端选项卡

4

我有一个需要这样调用的命令:

command "complex argument"

如果我想运行gnome-terminal并传递参数,可以按照以下方式进行:

gnome-terminal -e 'command "complex argument"'

我希望在终端中打开多个选项卡,每次使用不同的参数执行此命令。操作方式如下:
gnome-terminal -e 'command "complex argument1"' --tab -e 'command "complex argument2"'

但是,如果我想用脚本执行它,问题就来了。在这种情况下,我需要从循环中获取每个标签页的参数(即标签页的数量是可变的)。我的基本想法是将参数收集到一个单独的变量中,然后将其传递给gnome-terminal。但我不知道如何做到这一点,同时保留所有嵌套引号参数的完整性。如果我调用gnome-terminal "$args",则所有内容都被压缩在一个参数中;如果我调用gnome-terminal $args,则所有内容都会被分解为每个空格。

有没有办法在bash中组合这样复杂的参数?或者,另外有没有办法向gnome-terminal发送IPC消息,告诉它打开一个新标签页并执行命令?我知道我可以用Konsole做到这一点,但现在我想用gnome-terminal实现它。


5个回答

3

我遇到了和你一样的问题,在试图解决它时发现了这篇文章。如果“复杂的参数”依赖于shell扩展,我认为你需要使用传递给gnome-terminal的命令启动一个shell。例如:

gnome-terminal \
--tab -e "sh -c 'command \"complex argument1\"'" \
--tab -e "sh -c 'command \"complex argument2\"'"

您可以启动bash或其他shell而不是sh。有关更多示例,请参见此Stack Exchange帖子


2

不确定这篇文章是否还有用,因为它已经有一年的时间了,但我在BASH中编写gnome-terminal脚本时遇到了类似的问题。我的答案与riachdesign相似,但转义字符不同。这是我所做的:

gnome-terminal -e bash -c "/home/someprogramtorun /home/user/'$dir'/filetopasstoprogram.txt"

如果我没有在$dir周围添加单引号(例如,$dir vs. '$dir'),该行将逐字执行(即,它不会将变量的内容传递到该行)。希望这有所帮助。

0
据我所知,您可能需要转义双引号(或单引号,无论您在$args周围使用哪种引号),例如:('command \"complex argument1\"' --tab -e 'command \"complex argument2\"')。

0

0
我找到了解决方案:数组。它们可以做魔术。
# initial arguments
command=(gnome-terminal -e 'command "complex argument"')
...
# add extra arguments
command=("${command[@]}" --tab -e 'command "complex argument2"')
...
# execute command
"${command[@]}"

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