実行プログラムがシェルスクリプトを起動すると、インタラクティブシェルでプログラムの実行が失敗する

実行プログラムがシェルスクリプトを起動すると、インタラクティブシェルでプログラムの実行が失敗する

[この記事では、調査結果を追加し、要点をより早く把握するために元の記事を編集しました。 @ctrl-alt-delorさんのおかげで]

このスクリプトを使用する理由:

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

次のデスクトップショートカットをダブルクリックして開いたターミナルウィンドウから呼び出すと、指定された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また、似ているように見える他の12とは異なり、デスクトップショートカット/ランチャーからスクリプトを呼び出すことはまったく含まれていません。

スクリプトの明らかな不条理について心配しないでください。この記事の目的のために、他の問題が気を散らすことなく問題を再現するための最も簡単な例を提供するために意図的に単純化されました。

その後のテストでは、javaを呼び出すコマンドがstdoutとsdterrのいずれかまたは両方をリダイレクトするかどうかに関係なく、動作が同じであることを示しました。手動で開くターミナルウィンドウでスクリプトを手動で呼び出すと、Javaアプリケーションは常に表示されますが、スクリプトが呼び出されますデスクトップショートカットから起動したときにJavaアプリケーションが常に表示される場合動作します。

@Michael Prokopekが提案したようにターミナル環境を調べたところ、printenv各ターミナルウィンドウに固有のように見えるGNOME_TERMINAL_SERVICE変数とGNOME_TERMINAL_SCREEN変数を除いて、違いはありませんでした。

ところで、WindowsでDOSスクリプトを使用すると、まったくドラマティックではなく魅力的に動作します。

ベストアンサー1

おすすめ記事