3 votos

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

Tengo el relleno simplificado script 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 lo 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 :

He cambiado el tinglado por #!/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 vosotros entiendo la diferencia de comportamiento en Linux o BSD egrep es porque en el momento de la egrep la variable puede estar vacía.

Voy a utilizar por lo tanto, el siguiente regExp :

egrep "File=|OK"

Gracias de nuevo :)

0 votos

¿Puede añadir el BASH_VERSION ¿tanto desde MacOS como desde Linux?

1 votos

Creo que el script está demasiado simplificado para mostrar su verdadera intención. Se supone que los argumentos del script son expresiones regulares?

0 votos

@patrix Actualizo la Pregunta con la información de la versión de bash porque los comentarios sólo utilizan el formato mini-Markdown que es un dolor en el @~~

3voto

Michael Zhou Puntos 167

El shell expande la subexpresión $file en el lado derecho de la tubería antes de que la variable tenga algún valor. Así que en ambas funciones egrep se llama en realidad con la cadena vacía en lugar de $file . La primera función no arroja 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 fucnión la diferencia entra en juego porque la subexpresión vacía provoca BSD egrep (el que se utiliza en MacOS) para lanzar un error.

Ejemplo:

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

como otro ejemplo con $file que no tiene ningún valor

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

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

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

No tengo ni idea de por qué estás usando egrep cuando se buscan cuerdas fijas.

0 votos

La expansión se realiza mediante bash no por egrep Así que me cuesta un poco entender tu primera frase.

0 votos

@patrix Sí, tienes razón. Lo editaré.

0 votos

Gracias. Sin embargo, todavía me pregunto por qué funciona en Linux

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X