
스크립트는 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