有没有办法告诉已经运行的 x 程序从 bash 打开文件?(即不调用程序的新实例。)当我在 的上下文中提出这个问题时xstata-mp
,我更感兴趣的是这种解决方案是否普遍存在于Xorg 应用程序中。
我有一个运行xstata-mp
良好的 x 应用程序(专有的,对这个问题很重要)。我设法制作了一个很好的启动脚本,它首先检查是否xstata-mp
已经在运行,如果是,将它带到前台,否则启动它。很像这个问题的公认答案。
我的问题是,有时我想打开一个由(例如,数据文件、脚本文件、帮助文件等)使用的文档。如果我双击此类文件的图标,或者在已经运行时选择该图标并点击,则启动脚本被调用(它在文件的部分中被引用)并被提升到可见窗口的顶部,但是无需打开文档。xstata-mp
.dta
.do
.sthlp
<ENTER>
xstata-mp
exec
xstata-mp
.desktop
xstata-mp
对于它的价值,如果我在其中打开多个文档(例如,使用),检查pidof
它似乎xstata-mp
不会启动新进程;与多个标签/站点进行对比。xstata-mp
<CTRL>-O
Firefox
这是我要修改的启动脚本:
# Check if xstata-mp v17 is running
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)
# if xstata-mp v17 IS NOT running, then launch it with argument $1
if [ -z "$exit_code_pidof_xstata_mp" ]
then
/usr/local/stata17/xstata-mp -q $1; exit >/dev/null
# but if xstata-mp v17 IS running, then bring it to front instead
else
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; exit > /dev/null
fi
首先,您应该找出打开文档的正确命令。所以尝试运行以下命令,看看你得到了什么。
当然,这是关键部分。在这里,您完全依赖程序的功能。如果它不提供该选项,那么您就不能这样做,因为 bash 所能做的就是启动另一个程序。从我从StataCorp LLC下载的 399 页的 9.4 MB 用户手册中,没有一个关于如何使用的提示
xstata-mp
。也许该
-q
选项已经是您想要的。但是让我们假设将另一个文档添加到已经运行的实例中的正确选项xstata-mp
是-a
(如在 VS Code 中:)code -a
。然后,您所要做的就是在您的else
声明下方添加以下行:它会打开您的文档并立即显示当前窗口。
是的:有一种方法可以告诉已经运行的 x 程序从 bash 中打开文件!
因此,根据 StataCorp 技术支持人员的提示,事实证明(如果您的系统上尚未
xdotool
安装,则可以使用 安装)为我的问题中的那种问题提供了解决方案。sudo apt install xdotool
来自项目网站:为了解决我的问题
xdotool
,我需要创建一个xdotool
我正在调用的脚本statadoc.xdo
:关于这个简短脚本的一些评论:
/usr/bin/xdotool
,因此请务必确认 withwhich xdotool
或类似。"Stata/MP 17.0"
与上面提供的字符串。这很有用,例如,将版本升级到 17.1 或 18.x 不会破坏脚本。该search
命令标识了我要与之交互的 X 应用程序窗口。xdotool
脚本接受参数,遵循bash
-like$1
、$2
等约定。type
命令按字面意思输入提供的文本——在我的例子中,在第2 行的命令标识的第一个(仅在我的例子中)窗口中提供的两个字符串参数$1
的内容。$2
search
key
命令向同一个 Stata 窗口发送<ENTER>
(或者<RETURN>
如果您愿意)。现在让我们看看我修改后的启动脚本,它
statadoc.xdo
在第三行到最后一行调用(我在前面添加了一个部分来识别提供的参数是否指示特定的 Stata 文件类型——需要不同的使用命令来优雅地处理每个...我的例子是不完整,但这些是我在大部分工作中使用的文件类型):注意:这是在 Xorg 上运行的 Gnome 的解决方案。