スクリプトは自分自身を実行している.desktopファイルのパスをどのように知ることができますか?

スクリプトは自分自身を実行している.desktopファイルのパスをどのように知ることができますか?

スクリプトは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

おすすめ記事