我有以下示例脚本:
#! /usr/bin/env bash
app.exit () {
printf "I am exiting\n"
builtin exit
}
app.abort () {
printf "\nI am aborting\n"
exit
}
trap app.abort SIGHUP SIGINT SIGQUIT SIGTERM
trap app.exit EXIT
output="This is a test 1 run() : core 2 assert() : core"
test="This+( )is+( )a+( )test*(*)+([0-9])+( )assert()+( ):+( )core*(*)+( )"
shopt -s extglob
set -x
[[ "$output" == $test ]] && echo "match" || echo "not match"
set +x
exit 0这有几个问题让我挠头。
正如您所看到的,我正在使用扩展的全局计算两个字符串。String output是应用程序的输出。字符串test是使用扩展全局化的期望值。
由于测试字符串包含一个尾随的+( ) (一个或多个空格),并且输出字符串不包含尾随空格,所以我预计这将打印"not“。
然而,当对其进行评估时,bash只是挂起,这就引出了下一个问题。
正如您所看到的,我已经捕获了中断并退出,以允许一个优雅的终止(删除任何临时文件等等)。当脚本在评估期间挂起时,我无法再控制-c退出。
有人知道为什么会这样吗?
我知道如何修复测试字符串,这样它就不会再失败了。我最关心的是,测试字符串是在我的应用程序中的另一个位置进行评估的配置文件中的一个。如果它挂了,一切都会停止。
有人知道这里发生了什么吗?事实上,这只是挂起而不能终止,这似乎是bash的严重问题。
发布于 2019-08-13 16:56:38
基于对这个问题的评论,并使用这个最小的例子:
#! /usr/bin/env bash
aaa="This is a test 1 run() : core 2 assert() : core"
bbb="_(*)a"
shopt -s extglob
[[ "$aaa" == $bbb ]] && echo "match" || echo "not match"同样的行为(非常长/无限的运行时)发生在_或+或*之后,也就是$bbb中的a所在的位置。
如果$bbb只是+(*)或*(*),那么它就会迅速退出(带有“match”)。更进一步说,如果$bbb以+(*)或*(*)结尾,那么它就会迅速退出。关键似乎是在+(*)或*(*)之后拥有一些东西。
总的来说,而且没有办法直接验证这一点,我同意前面一些似乎被删除的评论,即这“闻起来像是”指数式的或无限的回溯。
我也同意@chepner的观点,即*的意思总是与+(*)或*(*)的意思相同,并且在等待修补程序时,它是一个完美(对我来说更可取)的替代品。
https://stackoverflow.com/questions/57481631
复制相似问题