打开 xterm 以外的终端,在其上运行命令,并且在成功完成后不关闭终端

打开 xterm 以外的终端,在其上运行命令,并且在成功完成后不关闭终端

我的 Arch Linux 盒子中有以下脚本:

#!/bin/bash
xterm -e "sudo pacman -Syu;bash"

这将启动 xterm 并sudo pacman -Syu在其上运行命令。由于该;bash部分的原因,一旦命令完成,它不会关闭 xterm 窗口。这是一个用于更新我的系统的命令,我不希望它关闭,因为我想查看输出。

为什么这不适用于其他终端,特别是 lxterminal 和 roxterm(我尝试过的唯一其他终端)?使用lxterminalroxterm代替的完全相同的命令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,并且多次成为讨论的话题。

进一步阅读:

相关内容