首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash挂起评估扩展全球化

Bash挂起评估扩展全球化
EN

Stack Overflow用户
提问于 2019-08-13 16:11:58
回答 1查看 66关注 0票数 1

我有以下示例脚本:

代码语言:javascript
复制
#! /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的严重问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 16:56:38

基于对这个问题的评论,并使用这个最小的例子:

代码语言:javascript
复制
#! /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的观点,即*的意思总是与+(*)*(*)的意思相同,并且在等待修补程序时,它是一个完美(对我来说更可取)的替代品。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57481631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档