egrep: expresión (sub) vacía: comportamiento inesperado para bash Loop en Mac

3

Tengo el guión simplificado de relleno en Mac OS X 10.12:

#!/usr/bin/env bash

echo "=> BASH_VERSION = $BASH_VERSION"
function testForLoopMac {
local file
for file
do
    echo File=$file
done | egrep "$file"
}

function testForLoopMacBis {
local file
for file
do
    echo File=$file
done | egrep "$file|OK"
}

testForLoopMac $@

testForLoopMacBis $@

Pero el resultado cuando ejecuto es:

$ testForLoopMac.sh example.pdf 
=> BASH_VERSION = 3.2.57(1)-release
File=example.pdf
egrep: empty (sub)expression

En Debian / Ubuntu Linux, el resultado es:

$ testForLoopMac.sh example.md 
=> BASH_VERSION = 4.3.30(1)-release
File=example.md
File=example.md

Editar: con bash4 en Mac OSX 10.12:

Cambié el shebang a #!/usr/bin/env bash4 y el resultado es el mismo:

$ testForLoopMac.sh example.md 
=> BASH_VERSION = 4.4.12(1)-release
File=example.md
egrep: empty (sub)expression

Edit: Gracias a ustedes, entiendo que la diferencia de comportamiento en Linux o BSD egrep se debe a que en el momento de la ejecución de egrep la variable puede estar vacía.

Voy a utilizar, por lo tanto, el siguiente regExp:

egrep "File=|OK"

Gracias de nuevo :)

    
pregunta SebMa 05.05.2017 - 11:17

1 respuesta

3

El shell expande la subexpresión $file en el lado derecho de la tubería antes de que la variable tenga algún valor. Entonces, en ambas funciones se llama a egrep con la cadena vacía en lugar de $file . La primera función no produce un error porque un patrón vacío es un parámetro válido para egrep tanto en macOS como en Linux. En la segunda función, la diferencia entra en juego porque la subexpresión vacía hace que BSD egrep (el que se usa en macOS) genere un error.

Ejemplo:

echo foo | egrep "|foo"
egrep: empty (sub)expression

como otro ejemplo con $file sin valor

echo foo | egrep "$file|foo"
egrep: empty (sub)expression

Por lo tanto, como solución alternativa en el uso de su función:

egrep -e "$file" -e 'OK'

No tengo idea de por qué estás usando egrep cuando estás buscando cadenas fijas.

    
respondido por el fd0 06.05.2017 - 18:50

Lea otras preguntas en las etiquetas