Opening multiple tabs in gnome terminal with complex commands from a cycle

时光毁灭记忆、已成空白 提交于 2019-12-01 20:44:02

问题


I have a command that needs to be called like this:

command "complex argument"

If I want to run gnome-terminal passing it this argument, it goes like this:

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

I want to open multiple tabs in the terminal, executing this command with different arguments each time. This works this way:

gnome-terminal -e 'command "complex argument1"' --tab -e 'command "complex argument2"'

But the problem comes if I want to execute it with a script, where I get the parameters for each tabs from a cycle (i.e. the number of tabs is variable). My basic idea was that I collect the arguments to a single variable, then pass it to gnome-terminal. But I don't know how to do this leaving all the nested quoted arguments intact. Either everything is compressed in one argument (if I call gnome-terminal "$args"), or it falls apart by every whitespace (if I call gnome-terminal $args).

Is there any way to compose such complex arguments in bash? Or, alternatively, is there any way to send IPC messages to gnome-terminal, telling it to open a new tab and execute a command? I know I can do this with Konsole, but now I want to do it with gnome-terminal.


回答1:


I just ran into this same problem and came across this post while trying to fix it. If "complex argument" relies upon shell expansion, I believe that you will need to start a shell with the command passed to gnome-terminal. For example:

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

You can start bash or any other shell instead of sh. For more examples see this stack exhange post.




回答2:


Not sure this will help out as the post is about a year old, but I had a similar issue scripting gnome-terminal in BASH. My answer is similar to riachdesign, but the escape characters differ. Here's what I did:

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

If I didn't add the single quotes around $dir (e.g., $dir vs. '$dir') the line would execute verbatim (i.e., it would not pass the variable's contents into the line).

Hopefully that helps.




回答3:


AFAIK, you may need to escape the double quotes (or single quotes, whatever you use around $args), like so. ('command \"complex argument1\"' --tab -e 'command \"complex argument2\"')




回答4:


Have a look at this ruby gem that does exactly that: https://github.com/Achillefs/elscripto




回答5:


I found the solution: arrays. They can do magic.

# initial arguments
command=(gnome-terminal -e 'command "complex argument"')
...
# add extra arguments
command=("${command[@]}" --tab -e 'command "complex argument2"')
...
# execute command
"${command[@]}"


来源:https://stackoverflow.com/questions/6611542/opening-multiple-tabs-in-gnome-terminal-with-complex-commands-from-a-cycle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!