egrep: espressione vuota (sotto): comportamento imprevisto per bash Loop su Mac

3

Ho lo script di riempimento semplificato su 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 $@

Ma il risultato quando corro è:

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

Su Debian / Ubuntu Linux, il risultato è:

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

Modifica: con bash4 su Mac OS X 10.12:

Ho cambiato lo shebang in #!/usr/bin/env bash4 e il risultato è lo stesso:

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

Modifica: Grazie a voi ragazzi capisco che la differenza di comportamento su Linux o BSD egrep è perché al momento dell'esecuzione di egrep la variabile può essere vuota.

Vado quindi ad utilizzare, il seguente regExp:

egrep "File=|OK"

Grazie ancora:)

    
posta SebMa 05.05.2017 - 11:17
fonte

1 risposta

3

La shell espande la sottoespressione $file sul lato destro della pipe prima che la variabile abbia alcun valore. Quindi in entrambe le funzioni egrep viene effettivamente chiamato con la stringa vuota al posto di $file . La prima funzione non genera un errore perché un pattern vuoto è un parametro valido per egrep sia su macOS che su Linux. Nella seconda parte la differenza entra in gioco perché la sottoespressione vuota causa BSD egrep (quella usata su macOS) per generare un errore.

Esempio:

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

come altro esempio con $file senza valore

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

Quindi, come soluzione temporanea nella tua funzione usa:

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

Non ho idea del motivo per cui stai utilizzando egrep quando cerchi stringhe fisse.

    
risposta data 06.05.2017 - 18:50
fonte

Leggi altre domande sui tag