我的 Arch Linux 盒子中有以下脚本:
#!/bin/bash
xterm -e "sudo pacman -Syu;bash"
这将启动 xterm 并sudo pacman -Syu
在其上运行命令。由于该;bash
部分的原因,一旦命令完成,它不会关闭 xterm 窗口。这是一个用于更新我的系统的命令,我不希望它关闭,因为我想查看输出。
为什么这不适用于其他终端,特别是 lxterminal 和 roxterm(我尝试过的唯一其他终端)?使用lxterminal
或roxterm
代替的完全相同的命令xterm
将启动终端并在命令执行后立即关闭它。
答案1
不同的仿真器具有不同的保持打开功能的功能和协议。有些人根本不会/不能这样做。其他要求脚本指定模拟器保持打开状态。我在为名为 HDSentinel 的程序编写简单脚本时遇到了这个问题。以下是我可以想到的各种解决方案:
KDE(控制台模拟器)
konsole -hold -e sudo ./HDSentinel
(-hold
是需要的参数)
Enlightenment(术语模拟器)
terminology --hold -e "sudo ./HDSentinel"
(--hold
是需要的参数)
XFCE(XFCE4模拟器)
xfce4-terminal -H -x "sudo ./HDSentinel"
(-H
是需要的参数;)
编辑:在 xfce 终端中使用 -x 代替 -e
Mate(伴侣终端模拟器)
mate-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(使用此模拟器,您必须首先创建一个自定义配置文件以保持模拟器打开,我将其称为 HoldOpen,但任何名称都可以)
Gnome(Gnome 终端模拟器)
gnome-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(与 Mate 工作方式相同,创建配置文件以保持模拟器打开)
LXDE(lx终端)
LXDE自带的模拟器lxterminal
不支持保持终端打开
因此,最重要的是,有些模拟器将支持保持打开状态,有些则不支持。对于那些这样做的人,启用该功能的方式会有所不同。如果您正在查看此处未列出的模拟器,则必须在该模拟器上进行谷歌搜索以了解是否/如何启用保持打开状态。
如果您拥有的模拟器根本不支持保持打开状态,您可能会发现您的发行版确实包含支持它的备用模拟器(许多发行版包括 xterm 及其桌面版本模拟器)。如果您没有支持保持打开的模拟器,您可以随时从软件存储库中获取一个。
这些信息代表了相当多的研究时间,所以我希望这将帮助人们节省一些时间和挫败感。顺便说一句,xterm 也使用该-hold
参数,因此我相信这;bash
将有助于保持打开模拟器,该模拟器为保持打开功能提供参数。但是,如果模拟器不支持此功能(如 lxterminal 的情况),则它不会创建保持打开功能;如果模拟器使用自定义配置文件来启用保持打开功能(如 Gnome 的情况),则不会启用保持打开功能。
答案2
本质问题是基于 VTE 的终端不能以相同的方式处理命令行。方式作为 xterm。这不包括(在本讨论中不必要的)保留选项可能出现的问题。
该命令中的引号
xterm -e "sudo pacman -Syu;bash"
是问题所在。带引号的字符串是单个标记,作为单个参数传递给 xterm。
对于 xterm,首先尝试将后面的标记-e
作为 execv 调用的参数。如果失败,它会尝试类似的操作"${SHELL:-sh}" -c "parameters"
(运行您首选的 shell 来解释parameters
为命令行)。 konsole 执行其中一个操作(可能是第一个,因为这是 xterm 的原始行为,并且 konsole 的大部分设计可以追溯到 20 世纪 90 年代末)。当 xterm 被修改为 luit 时,“失败”替代方案有助于将参数传递给 luit。
基于 VTE 的终端有一段时间尝试在一个命令行选项中执行一个方面,而在另一个选项中执行另一个方面(我记得,-e
和-x
, 但交换这两个选项的作用以及我目前没有看到的有趣的 Debian bug 报告的主题)。在当前版本中,尝试
gnome-terminal -e "sudo pacman -Syu;bash"
失败是因为它只适用于原始的类似 xterm 的行为。并且(请记住,其他终端使用较旧版本的 VTE),由于 gnome 终端的开发人员(与 VTE 开发人员重叠......)-x
不久前放弃了该选项,该选项对该命令不可用。 这之所以有效,是因为它遵循原始的 xterm 模型:
gnome-terminal -e "bash -c \"sudo pacman -Syu;bash\""
该-e
选项在 Debian 中通过 shell 脚本部分解决,该脚本尝试提供一组最小的选项(包括标题选项)。 Debian 对此的政策是基于 20 世纪 90 年代末的 xterm,并且多次成为讨论的话题。
进一步阅读: