スクリプトはbash
ファイルによって実行されたかどうか、どのように.desktop
実行プログラムのパスを知ることができますか?
ボーナスポイント:スクリプトで使用するために"comment"
このファイルのフィールドをどのように抽出しますか?.desktop
答え1
環境変数GIO_LAUNCHED_DESKTOP_FILE
にはファイルパスが含まれ、ファイルが元々.desktop
呼び出さGIO_LAUNCHED_DESKTOP_FILE_PID
れたプログラムのプロセスIDが含まれています.desktop
。 PIDを確認する必要があります。それ以外の場合、スクリプトはデスクトップファイルによって呼び出されるプログラムによって呼び出されますが、実際にはデスクトップファイルによって呼び出されると誤って考えることができます。
if [ -n "$GIO_LAUNCHED_DESKTOP_FILE" ] && [ "$$" -eq "$GIO_LAUNCHED_DESKTOP_FILE_PID" ]; then
echo "I was invoked by $GIO_LAUNCHED_DESKTOP_FILE"
else
echo "I wasn't invoked by a .desktop file"
fi
ファイルをインポートすると、この環境変数は存在しないため、すべてのアプリケーションや環境で機能しない可能性があるため、.desktop
まだどこでもサポートされていない可能性があります。操作が完了すると、Gnomeアプリケーションは正常に動作します。Glibライブラリから。
デスクトップファイルにあり、Terminal=true
端末エミュレータにインスタンスごとに1つのプロセスではなくすべてのインスタンスを実行する単一のプロセスがある場合、環境変数が設定されない可能性があります。たとえば、Gnome Terminalの動作方法は次のとおりです。gnome-terminal …
デスクトップファイルからコマンドを明示的に実行する場合も同様です。端末ごとに1つのプロセスを実行する端末エミュレータ(xtermなど)は正常に動作します。
私はデスクトップファイルを解析できるシェルツールを知りません。 grep、sed、awkなどの一般的なツールを使用できますが、バックスラッシュエスケープや言語固有の項目(またはサポートしないように選択)などの操作を処理する必要があります。以下は、単純なケース(バックスラッシュなし、デフォルト言語)からコメントを抽出するスクリプトです。
if [ -n "$GIO_LAUNCHED_DESKTOP_FILE" ] && [ "$$" -eq "$GIO_LAUNCHED_DESKTOP_FILE_PID" ]; then
comment=$(<"$GIO_LAUNCHED_DESKTOP_FILE" sed -n 's/^Comment=//p')
if [ -n "$comment" ]; then
echo "I was invoked by $GIO_LAUNCHED_DESKTOP_FILE with the following comment:"
echo "$comment"
else
echo "I was invoked by $GIO_LAUNCHED_DESKTOP_FILE with no comment"
fi
else
echo "I wasn't invoked by a .desktop file"
fi