我正在尝试打开终端仿真器,同时向其传递复合命令。执行此操作的命令有哪些(两种版本:终端在完成后保持打开状态或关闭)?
例如,对于xterm
终端仿真器,该命令xterm -e "ls; sleep 3"
将创建一个新的xterm
GUI 窗口,列出当前目录,等待 3 秒,然后关闭该窗口。
gnome-terminal
我对、konsole
、lxterminal
、、和rxvt
的调用以及 Windows 的特别感兴趣。terminator
xfce4-terminal
xterm
cmd
以下是迄今为止我自己发现的一些示例用法:
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 也遵循-e
xterm 的行为(现行的惯例)。
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
在解析主命令字符串。
使用我发现的一个技巧这里,您可以调用bash
,xterm
从而使 shell 保持打开状态,从而产生持久变体:
rxvt -e bash -c "ls;sleep 3;bash"
这也适用于konsole
、lxterminal
和terminator
(terminator
至少-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"
其余问号我认为都不可能。
欢迎随意使用任何新终端、新调用或更正来编辑此表。