스크립트는 자신을 실행하는 .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터미널 에뮬레이터에 인스턴스당 하나의 프로세스가 아닌 모든 인스턴스를 실행하는 단일 프로세스가 있는 경우 환경 변수가 설정되지 않을 수 있습니다. 예를 들어, Gnome Terminal이 작동하는 방식은 다음과 같습니다. gnome-terminal …데스크탑 파일에서 명령을 명시적으로 실행하는 경우에도 마찬가지입니다. 터미널당 하나의 프로세스를 실행하는 터미널 에뮬레이터(예: 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

관련 정보