
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 grep
el 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 grep
coincida.
La solución es cambiar su grep
alias a be --color=auto
o do unalias grep
o agregarlo manualmente --color=never
a 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 --norc
y 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 +H
y set -m
.