Shell script, como ler valor em arquivo .desktop?

Preciso de ajuda em um shell script.

Tenho um arquivo “ksnip (1.9.1-continuous).desktop”, no diretório /home/myuser com esse conteúdo:

[Desktop Entry]
Type=Application
Exec=/home/teste/Applications/ksnip-1.9.1-continuous-x86_64_68df098c931e2770b6c198a82ab58525.AppImage
Icon=appimagekit_6c4589a7de8a293b3231312eb83352ad_ksnip
Terminal=false
StartupNotify=false
Name=ksnip (1.9.1-continuous)
GenericName=ksnip Screenshot Tool
Comment=Cross-platform screenshot tool that provides many annotation features for your screenshots.
Categories=Utility;
Actions=Remove;Update;

X-AppImage-Version=1.9.1-continuous

[Desktop Action Area]
Exec=/home/teste/Applications/ksnip-1.9.1-continuous-x86_64_68df098c931e2770b6c198a82ab58525.AppImage -r
Icon=appimagekit_6c4589a7de8a293b3231312eb83352ad_ksnip
Name=Capture a rectangular area

dentro de um shell script quero pegar o valor do que está no primeiro “Icon=”, Ou seja eu preciso que esse valor:

appimagekit_6c4589a7de8a293b3231312eb83352ad_ksnip

e passar para uma variável shell script, como fazer isso?

ICON=$(grep -m1 '^Icon=' arquivo.desktop | cut -d= -f2-)

ICON=$() → saída de comando na variável ICON

grep → busca de padrão em arquivo ou entrada
-m1 → restringir às primeiras 1 ocorrências (ou seja, a primeira)
'^Icon=' → padrão: linhas que começam (^) com Icon=

| → saída de comando torna-se entrada para outro

cut → cortar arquivos ou entradas com base num delimitador
-d= → especificar = como delimitador
-f2- → do segundo corte em diante (a partir do primeiro =).

3 curtidas

Obrigado pela ajuda funcionou.

Mas aconteceu algo estranho.
quando o arquivo não tem a extensão declarada no nome do arquivo. Ele da erro: “Arquivo ou diretório inexistente”
ex: o arquivo está salvo assim: ‘ksnip (1.9.1-continuous)’ sem extensão.

#!/bin/bash
ICON=$(grep -m1 '^Icon=' '/home/myuser/ksnip (1.9.1-continuous)' | cut -d= -f2-)
echo $ICON

retorna esse erro:

“Arquivo ou diretório inexistente”

Porém mantendo o nome do arquivo sem extensão, e no script escrevendo a extensão ele funciona normal:

#!/bin/bash
ICON=$(grep -m1 '^Icon=' '/home/myuser/ksnip (1.9.1-continuous).desktop' | cut -d= -f2-)
echo $ICON

retorna:

appimagekit_6c4589a7de8a293b3231312eb83352ad_ksnip

Você usa qual ambiente gráfico?

Me lembro que passei por um momento “coçando a cabeça” no MATE com algo parecido, até perceber que o gerenciador de arquivos dava um tratamento diferenciado a arquivos .desktop – em vez de ver e editar o nome do arquivo em si, o campo Name= dentro arquivo era.

Tô usando o Mint Cinnamon x64 X11

Pelo que eu me lembro dele, o Cinnamon tem o mesmo comportamento. Usar mv no terminal (por exemplo) deve eliminar essa interferência e permitir renomear o arquivo em si.