
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 grep
que é 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 grep
corresponda.
A solução é alterar seu grep
alias para be --color=auto
, ou do unalias grep
, ou adicioná-lo 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.
Então você pode começar com um ambiente limpo bash --noprofile --norc
e 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 +H
e set -m
.