Wird eine Subshell mit einem Here-String ausgeführt?

Wird eine Subshell mit einem Here-String ausgeführt?

Ich versuche, im Rahmen einer Neufassung/Neuorganisation ein Bash-Skript besser zu organisieren und frage mich, was in der folgenden Situation die „beste Vorgehensweise“ ist:

ymd=`echo "${NOEXT}" | egrep -o -m 1 "\-20[0-9]{2}\-[0-9]{2}\-[0-9]{2}\-"`

oder

ymd=`egrep -o -m 1 "\-20[0-9]{2}\-[0-9]{2}\-[0-9]{2}\-" <<< ${NOEXT}` 

Ich glaube, dass die erste Version aufgrund der Pipe eine Unterschale erstellt. Tut dies die zweite Version mit der Zeichenfolge hier? Ich gehe davon aus, dass dies nicht der Fall ist, möchte aber meine Annahmen überprüfen.

Antwort1

Bei Letzterem ist dies nicht der Fall, was Sie (grob) überprüfen können, indem Sie (auf einem inaktiven System) den Anstieg der PIDs beobachten – bei Ausführung des Ersten steigt dieser um 2, bei Ausführung des Letzteren nur um 1.

Aber es ist einBashismusund sollte vielleicht durch ein Dokument hier ersetzt werden:

ymd=`egrep -o -m 1 "\-20[0-9]{2}\-[0-9]{2}\-[0-9]{2}\-" <<EOF
${NOEXT}
EOF`

Antwort2

Wenn Sie POSIX-Kompatibilität verwenden können bashund nicht benötigen, können Sie den regulären Ausdrucksabgleich durchführen, ohne den externen Aufruf von zu verwenden egrep.

[[ $NOEXT =~ -20[0-9]{2}-[0-9]{2}-[0-9]{2}- ]]
ymd=${BASH_REMATCH[0]}

verwandte Informationen