Quando você tem problemas como esse, comece a remover coisas do seu teste até conseguir algo que funcione.
Por exemplo, se o seu ponto de partida é:
comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment
Primeiro tire as coisas variáveis:
cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
Em seguida, tire o segundo grep :
cat /usr/share/applications/brasero.desktop |grep '^Comment='
Em seguida, o outro grep:
cat /usr/share/applications/brasero.desktop
Eventualmente, você encontrará um ponto em que ele começa a funcionar. No seu caso particular, ele começará a trabalhar com isso:
cat /usr/share/applications/brasero.desktop |grep '^Comment='
Então é esse segundo grep que é um problema. Adicione as outras coisas e veja se ainda funciona:
comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment
Realmente faz. Então qual é o problema? Bem, observe como neste último, a saída estava em cores? A saída possui códigos de escape de cor ANSI. Isso está impedindo o segundo grep de corresponder.
A correção é alterar seu grep alias para --color=auto ou unalias grep ou adicionar manualmente --color=never aos comandos.
Há também outra abordagem que pode ser adotada para isso. Como você sabe que funciona dentro de um script, a única explicação é que é ambiental.
Assim, você pode começar com um ambiente limpo, bash --noprofile --norc e começar a incluir seu perfil peça por peça até que ele quebre.
Existe uma pegadinha nessa técnica. Mesmo com --noprofile --norc , existem algumas diferenças entre o CLI e um script, como expansão do histórico e controle do trabalho. Você também pode desativá-las: set +H e set -m .