是否使用此处的字符串执行子 shell?

是否使用此处的字符串执行子 shell?

我正在尝试更好地组织 bash 脚本作为重写/重新组织的一部分,并且想知道在以下情况下“最佳实践”是什么:

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

或者

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

我相信第一个版本由于管道而创建了一个子 shell。第二个版本是否带有此处字符串?我认为没有,但我想验证我的假设。

答案1

后者则不然,您可以通过查看(在空闲系统上)PID 的增加来(粗略地)验证 - 运行前者时,它将增加 2,运行后者时,它只会增加 1。

但这是一个巴什主义,也许应该用下面的文档替换:

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

答案2

如果您可以使用bash并且不需要 POSIX 兼容性,则可以执行正则表达式匹配而不使用对的外部调用egrep

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

相关内容