grep funciona no script bash mas não no terminal

0

Eu 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 sobre o comportamento oposto.

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

Por outro lado, esses comandos funcionam bem no terminal e 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 o GNU bash, versão 4.4.0 (1) -release (x86_64-pc-linux-gnu), sob o Debian 8 Sid, com grep (GNU grep) 2.26. Eu tentei tanto no xfce quanto no terminal do mate, mas com o mesmo comportamento.

Obrigado

    
por George Vasiliou 04.11.2016 / 01:16

1 resposta

5

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 .

    
por 04.11.2016 / 02:52