在各种终端仿真器的新实例中打开命令

在各种终端仿真器的新实例中打开命令

我正在尝试打开终端仿真器,同时向其传递复合命令。执行此操作的命令有哪些(两种版本:终端在完成后保持打开状态或关闭)?


例如,对于xterm终端仿真器,该命令xterm -e "ls; sleep 3"将创建一个新的xtermGUI 窗口,列出当前目录,等待 3 秒,然后关闭该窗口。

gnome-terminal我对、konsolelxterminal、、和rxvt的调用以及 Windows 的特别感兴趣。terminatorxfce4-terminalxtermcmd


以下是迄今为止我自己发现的一些示例用法:

Emulator        |  Invocation (Exiting)              |  Invocation (Persistent)           |
----------------+------------------------------------+------------------------------------+
cmd             |  start CMD /C "DATE /T & TIME /T"  |  start CMD /K "DATE /T & TIME /T"  |
gnome-terminal  |  ???                               |  ???                               |
konsole         |  ???                               |  ???                               |
lxterminal      |  ???                               |  ???                               |
rxvt            |  ???                               |  ???                               |
terminator      |  ???                               |  ???                               |
xfce4-terminal  |  ???                               |  ???                               |
xterm           |  xterm -e "ls; sleep 3"            |  xterm -e "ls; sleep 3; bash"      |

有人能帮我补充更多吗?欢迎提供部分答案。

答案1

除了 之外cmd,这些都是 X 终端仿真器,并且大多数都提供了 xterm 选项的一些变体-e。它们之间的区别在于是否要求将选项值括起来。

除了 shell 限制之外,xterm 还使用全部作为命令的一部分,过去的标记-e。它们不需要像所示的那样被引用(这会产生一个标记)。rxvt 遵循该行为(请参阅文档)。

根据命令如何传递给 shell,也存在一些细微的差别;xterm 在手动的(寻找“shell”和“filter”),而其他的都没有提供这种程度的细节。你只能找到那些通过阅读源代码或测试。

根据文档,konsole 也遵循-exterm 的行为(现行的惯例)。

gnome-terminal 与惯例不同(参见文档):

--command命令, -e命令

运行命令启动时命令。

--execute命令 阿尔及利亚, -x命令 阿尔及利亚

执行命令命令及其论点阿尔及利亚启动时。终端将不会处理除此参数之外的任何参数。此行为模仿 xterm -e 行为。

也就是说,它的-e选项需要一个令牌。开发人员没有修改它以提供兼容性,而是选择提供相似的具有不同选项名称的功能。

其他的几乎使用了与 gnome-terminal 相同的代码,并且根据共享的程度,可以-e像其他的一样实现,或者只是从 gnome-terminal 复制:

外部终端

-e细绳--command=细绳--command细绳

此选项指定要在终端中运行的程序(及其命令行参数)。除 --command= 格式外,这必须是命令行上的最后一个选项。

终结者文档匹配 gnome-terminal

xfce4-终端文档与 lxterminal 匹配。

答案2

我遇到的主要问题似乎是,对于大多数终端仿真器来说,命令参数应该是单个项目(即没有 shell 样式的解析)。例如

rxvt -e "ls; sleep 3"

失败,尽管这是以相同的方式xterm调用的。

如果你尝试取消引用它,那也不会起作用。例如:

rxvt -e ls; sleep 3

被分别解析和执行,作为两个命令:

rxvt -e ls
sleep 3

使用我发现的一个技巧这里,您可以调用终端仿真器来运行bash,然后将命令传递给bash的解释器而不是仿真器的解释器。这既解决了问题,又具有更一致的行为,因为在所有情况下,它都bash在解析主命令字符串。

使用我发现的一个技巧这里,您可以调用bashxterm从而使 shell 保持打开状态,从而产生持久变体:

rxvt -e bash -c "ls;sleep 3;bash"

这也适用于konsolelxterminalterminatorterminator至少-x看起来也支持)。但是,如果您仔细想想(或使用gnome-terminal的等效项-x,然后在尝试关闭窗口时观察警告),您会意识到终端正在运行bash,并且bash正在运行bash。相反,您想要代替bash“将要终止”改为bash“不会终止”:

rxvt -e bash -c "ls;sleep 3;exec bash"

这在野外可以看到这里

笔记替代xterm-hold选项,它在其他一些终端上有等效选项(例如konsole--hold)。 hold 选项可防止终端仿真器关闭,但不会让您恢复交互性。这并不是我真正想要的,但为了完整性,我已将其列在下面。

这是表格(由于这些命令越来越长,因此格式不同)。我还添加了urxvt。所有调用都已测试:

Emulator       | Command Type        | Invocation                                      
---------------+---------------------+-------------------------------------------------
cmd            | exiting             | start CMD /C "DATE /T & TIME /T"                
               | persistent          | ???                                             
               | persistent (inter.) | start CMD /K "DATE /T & TIME /T"                
---------------+---------------------+-------------------------------------------------
gnome-terminal | exiting             | gnome-terminal -x bash -c "ls;sleep 3"          
               | persistent          | ???                                             
               | persistent (inter.) | gnome-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
konsole        | exiting             | konsole -e bash -c "ls;sleep 3"                 
               | persistent          | konsole --hold -e bash -c "ls;sleep 3"          
               | persistent (inter.) | konsole -e bash -c "ls;sleep 3;exec bash"       
---------------+---------------------+-------------------------------------------------
lxterminal     | exiting             | lxterminal -e bash -c "ls;sleep 3"              
               | persistent          | ???                                             
               | persistent (inter.) | lxterminal -e bash -c "ls;sleep 3;exec bash"    
---------------+---------------------+-------------------------------------------------
rxvt           | exiting             | rxvt -e bash -c "ls;sleep 3"                    
               | persistent          | ???                                             
               | persistent (inter.) | rxvt -e bash -c "ls;sleep 3;exec bash"          
---------------+---------------------+-------------------------------------------------
terminator     | exiting             | terminator -x bash -c "ls;sleep 3"              
               | persistent          | ???                                             
               | persistent (inter.) | terminator -x bash -c "ls;sleep 3;exec bash"    
---------------+---------------------+-------------------------------------------------
urxvt          | exiting             | urxvt -e bash -c "ls;sleep 3"                   
               | persistent          | urxvt -hold -e bash -c "ls;sleep 3"             
               | persistent (inter.) | urxvt -e bash -c "ls;sleep 3;exec bash"         
---------------+---------------------+-------------------------------------------------
xfce4-terminal | exiting             | xfce4-terminal -x bash -c "ls;sleep 3"          
               | persistent          | xfce4-terminal --hold -x bash -c "ls;sleep 3"   
               | persistent (inter.) | xfce4-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
xterm          | exiting             | xterm -e "ls;sleep 3"                           
               | persistent          | xterm -hold -e "ls; sleep 3"                    
               | persistent (inter.) | xterm -e "ls;sleep 3;exec bash"                 

其余问号我认为都不可能。

欢迎随意使用任何新终端、新调用或更正来编辑此表。

相关内容