grep funciona en script bash pero no en terminal

grep funciona en script bash pero no en terminal

Tengo un comportamiento extraño en mi terminal.

El siguiente comando no imprime nada en mi terminal:

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

Exactamente el mismo comando, la misma sintaxis funciona perfectamente dentro de un script bash.

Generalmente veo gente quejándose del comportamiento opuesto.

Sé que la operación anterior se puede realizar de cientos de maneras, pero no puedo entender por qué el comando anterior no funciona en mi terminal.

Por otro lado, estos comandos funcionan bien tanto en terminal como en 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

Utilizo GNU bash, versión 4.4.0(1) (x86_64-pc-linux-gnu), en Debian 8 Sid, con grep (GNU grep) 2.26. Lo he intentado tanto en xfce como en mate terminal pero el mismo comportamiento.

Gracias

Respuesta1

Cuando tengas problemas como este, deberías empezar a eliminar cosas de tu prueba hasta que obtengas algo que funcione.

Por ejemplo, si su punto de partida es:

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

Primero quita las cosas variables:

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

Luego quita el segundo grep:

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

Luego el otro grep:

cat /usr/share/applications/brasero.desktop

Con el tiempo encontrarás un punto en el que empieza a funcionar. En tu caso particular, comenzará a funcionar con esto:

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

Entonces es ese segundo grepel que es un problema. Vuelva a agregar las otras cosas y vea si todavía funciona:

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

De hecho lo hace. ¿Entonces, cuál es el problema? Bueno, ¿notas cómo en este último, la salida fue en color? La salida tiene códigos de escape de color ANSI. Esto impide que el segundo grepcoincida.

La solución es cambiar su grepalias a be --color=autoo do unalias grepo agregarlo manualmente --color=nevera los comandos.


También hay otro enfoque que se puede adoptar para esto. Como sabes que funciona desde un guión, la única explicación es que es ambiental.

Así que puedes empezar con un entorno limpio bash --noprofile --norcy empezar a introducir tu perfil poco a poco hasta que se rompa.

Sin embargo, esta técnica tiene un inconveniente. Incluso con --noprofile --norc, existen algunas diferencias entre CLI y un script, como la expansión del historial y el control de trabajos. Sin embargo, también puedes desactivarlos: set +Hy set -m.

información relacionada