grep funciona no script bash, mas não no terminal

grep funciona no script bash, mas não no terminal

Tenho um comportamento estranho no meu terminal.

O seguinte comando não imprime nada no meu terminal:

comment=$(
    cat /usr/share/applications/brasero.desktop | 
    grep '^Comment=' |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

Exatamente o mesmo comando, a mesma sintaxe funciona perfeitamente dentro de um script bash.

Normalmente vejo pessoas reclamando do comportamento oposto.

Eu sei que a operação acima pode ser feita de centenas de maneiras, mas não consigo entender por que o comando acima não está operando no meu terminal.

Por outro lado, estes comandos funcionam bem tanto no terminal quanto no script:

comment=$(
    cat /usr/share/applications/brasero.desktop |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop

Eu uso GNU bash, versão 4.4.0(1)-release (x86_64-pc-linux-gnu), no Debian 8 Sid, com grep (GNU grep) 2.26. Eu tentei no terminal xfce e mate, mas com o mesmo comportamento.

Obrigado

Responder1

Quando você tiver problemas como esse, você deve começar a remover coisas do seu teste até conseguir algo que funcione.

Por exemplo, se o seu ponto de partida for:

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment

Primeiro retire o material variável:

cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'

Em seguida, retire o segundo grep:

cat /usr/share/applications/brasero.desktop |grep '^Comment='

Então o outro grep:

cat /usr/share/applications/brasero.desktop

Eventualmente você encontrará um ponto onde ele começa a funcionar. No seu caso particular, começará a funcionar com isto:

cat /usr/share/applications/brasero.desktop |grep '^Comment='

Então é esse segundo grepque é um problema. Adicione as outras coisas de volta e veja se ainda funciona:

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment

Na verdade, é verdade. Então qual é o problema? Bem, notou como neste último a saída foi colorida? A saída contém códigos de escape de cores ANSI. Isso está impedindo que o segundo grepcorresponda.

A solução é alterar seu grepalias para be --color=auto, ou do unalias grep, ou adicioná-lo manualmente --color=neveraos 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.

Então você pode começar com um ambiente limpo bash --noprofile --norce começar a trazer seu perfil peça por peça até que ele quebre.

Porém, há um problema nessa técnica. Mesmo com o --noprofile --norc, existem algumas diferenças entre a CLI e um script, como expansão do histórico e controle de tarefas. Você também pode desativá-los: set +He set -m.

informação relacionada