![是否使用此处的字符串执行子 shell?](https://linux22.com/image/1350485/%E6%98%AF%E5%90%A6%E4%BD%BF%E7%94%A8%E6%AD%A4%E5%A4%84%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%89%A7%E8%A1%8C%E5%AD%90%20shell%EF%BC%9F.png)
我正在尝试更好地组织 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]}