Como um script poderia saber o caminho do arquivo .desktop que o iniciou?

4

Como um script bash saberia se foi lançado por um arquivo .desktop e como saberia o caminho desse lançador?

Pontos extras: Como eu extrairia o campo "comment" desse arquivo .desktop - para ser usado dentro do script?

    
por Richard LeClair 08.08.2015 / 10:53

1 resposta

5

A variável de ambiente GIO_LAUNCHED_DESKTOP_FILE contém o caminho para o arquivo .desktop e GIO_LAUNCHED_DESKTOP_FILE_PID contém o ID do processo originalmente chamado pelo arquivo .desktop . Você precisa verificar o PID, caso contrário, você pode acreditar incorretamente que o script foi invocado por um arquivo da área de trabalho, considerando que ele foi invocado por um programa invocado por um programa invocado por um programa chamado pelo arquivo da área de trabalho.

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

Isso pode não funcionar em todos os aplicativos ou em todos os ambientes, porque essa variável de ambiente não existia quando .desktop arquivos foram introduzidos, pode não ser suportado em todos os lugares ainda. Todos os aplicativos do Gnome devem funcionar desde que o trabalho é feito na biblioteca do Glib .

Observe que, se o arquivo da área de trabalho tiver Terminal=true , a variável de ambiente poderá não ser definida, se o emulador de terminal tiver um único processo que execute todas as instâncias, em vez de um processo por instância. É assim que o Gnome-terminal funciona, por exemplo. O mesmo se aplica se você executar explicitamente gnome-terminal … como o comando no arquivo da área de trabalho. Emuladores de terminal que executam um processo por terminal, como o xterm, funcionarão bem.

Não conheço nenhuma ferramenta shell para analisar arquivos da área de trabalho. Você pode usar ferramentas comuns como grep, sed, awk e assim por diante, mas você terá que lidar com coisas como escapes de barra invertida e entradas por idioma (ou escolha não suportá-las). Aqui está um script que extrai o comentário no caso simples (sem barras invertidas, idioma padrão).

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
    
por 08.08.2015 / 12:54