3 votes

egrep : (sous-)expression vide : comportement inattendu pour bash Loop sur Mac

J'ai le remplissage simplifié script sur 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 $@

Mais le résultat lorsque j'exécute est :

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

Sur Debian/Ubuntu Linux, le résultat est :

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

Edit : Avec bash4 sur Mac OSX 10.12 :

J'ai changé le shebang en #!/usr/bin/env bash4 et le résultat est le même :

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

Edit : Grâce à vous, je comprends la différence de comportement sous Linux ou BSD. egrep c'est parce qu'au moment de la egrep exécution, la variable peut être vide.

Je vais donc utiliser le regExp suivant :

egrep "File=|OK"

Merci encore :)

3voto

Michael Zhou Points 167

Le shell développe la sous-expression $file sur le côté droit du tuyau avant que la variable n'ait une quelconque valeur. Ainsi, dans les deux fonctions egrep est en fait appelé avec la chaîne vide à la place de $file . La première fonction ne génère pas d'erreur car un motif vide est un paramètre valide pour la fonction egrep à la fois sur MacOS et sur Linux. Dans le second cas, la différence entre les deux systèmes entre en jeu, car la sous-expression vide provoque une erreur d'interprétation. BSD egrep (celui utilisé sur MacOS) pour lancer une erreur.

Exemple :

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

comme autre exemple avec $file sans valeur

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

Donc, comme solution de rechange dans votre fonction, utilisez :

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

Je ne sais pas pourquoi vous utilisez egrep lorsque vous recherchez des cordes fixes.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X