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
.