当启动程序启动 shell 脚本时,从交互式 shell 启动程序失败

当启动程序启动 shell 脚本时,从交互式 shell 启动程序失败

[这篇文章是根据原文进行编辑的,以添加进一步调查的结果并更快地切入主题——感谢@ctrl-alt-delor]

为什么这个脚本:

#!/bin/bash
read -p "Press any key to continue: " key
nohup java -jar /path/to/compiled.jar &

当通过双击以下桌面快捷方式打开的终端窗口调用指定的 java GUI 应用程序时,无法成功启动/显示指定的 java GUI 应用程序:

[Desktop Entry]
Icon=bash
Exec=bash /path/to/the/above/script.sh
Type=Application
Terminal=true

从手动打开的终端窗口手动调用时它何时按预期工作?

出奇,如果仅通过添加命令来修改脚本sleep 0,则变为:

#!/bin/bash
read -p "Press any key to continue: " key
nohup java -jar /path/to/compiled.jar &
sleep 0

那么无论它是如何调用的,它都会按预期工作。

我对这篇文章的问题是:为什么需要睡眠命令?谁能解释这种行为?

我相信这个问题与StackExchange 问题 3886并且也与所有十几个看起来相似的其他人不同,因为它们都没有涉及从桌面快捷方式/启动器调用脚本的情况。

不要担心剧本明显的荒谬之处。为了这篇文章的目的,我特意对其进行了简化,以提供最简单的示例,该示例将重现该问题,而不会被其他问题分散注意力。

后续测试表明,无论调用 java 的命令是否重定向 stdout 和 sdterr 中的一个或两者,行为都是相同的:当从手动打开的终端窗口手动调用脚本时,java 应用程序始终显示,但在调用脚本时,java 应用程序始终显示从桌面快捷方式启动时,仅当从桌面快捷方式启动脚本时包含睡眠命令时,它才有效。

对终端环境的检查(printenv按照 @Michael Prokopek 的建议使用)没有发现任何差异,除了 GNOME_TERMINAL_SERVICE 和 GNOME_TERMINAL_SCREEN 变量,它们对于每个终端窗口来说似乎都是唯一的。

顺便说一句:在 Windows 上使用 DOS 脚本,工作起来就像一个魅力,完全没有戏剧性。

相关内容