防止 Bash 短路

Posted

技术标签:

【中文标题】防止 Bash 短路【英文标题】:Prevent short-circuiting in Bash 【发布时间】:2021-08-15 11:46:28 【问题描述】:

我想要

    生成匹配文件列表 知道是否至少有一种模式匹配

如果有任何 pdf 文件,以下将不起作用,因为第一个 compgen 将返回 true 而第二个 compgen 将不会被执行。

 compgen -G "*.pdf" || compgen -G "*.txt"; 

有没有办法防止短路?

【问题讨论】:

所以不要使用|| @KamilCuk 使用; 只会返回最后一个compgen 的结果。我仍然需要所有 compgens 的逻辑或来知道是否有任何匹配。 【参考方案1】:

使用 ;只会返回最后一个 compgen 的结果。我仍然需要所有 compgens 的逻辑或来知道是否有任何匹配。

您可以自己编写逻辑来处理退出状态。一个简短的版本可能如下所示:

 cmd1; ret=$?; cmd2; ! ((ret | $?)); 

【讨论】:

【参考方案2】:

使用extended glob pattern。

shopt -s extglob
compgen -G '*.@(pdf|txt)'

【讨论】:

【参考方案3】:

怎么样

files=( *.pdf *.txt )
compgen -W "$files[*]"

这会破坏包含空格的文件,但可以使用 IFS 来解决这个问题。

【讨论】:

以上是关于防止 Bash 短路的主要内容,如果未能解决你的问题,请参考以下文章

为啥短路不能防止与逻辑 AND (&&) 的不可达分支相关的 MissingMethodException?

你能防止 Lua 中的短路评估吗?

防止 MSYS 'bash' 杀死捕获 ^C 的进程

如何防止命令出现在 Bash 历史记录中?

防止 bash 打印“<PID> Aborted”消息

如何防止在 Docker 容器中运行的 bash 中扭曲西里尔文文本?