#search #text #unix #tool #text-search #cli-tool #cli

app bisect

基于位字符串模式在标准输入上搜索

2 个不稳定版本

0.2.0 2019 年 3 月 15 日
0.1.0 2019 年 3 月 14 日

#text-search 中排名第 42

MIT 许可证

10KB
91 行(不包括注释)

Bisect

bisect<位串>

根据位串参数打印标准输入的子集。位串应该是任意数量的 '0' 或 '1' 字符。第一个字符将打印 STDIN 的一半行(对于 0 是前半部分,对于 1 是后半部分)。每个额外的数字将“添加”剩余行的一半,其中 0 或 1 表示哪个一半。

通过逐步添加数字,您可以二分地重新构建原始输入,每次排除更小的子集。

这可以用于调试:例如,包括测试套件、包含的库或其他列表中未知元素导致问题的更大子集。

示例

考虑这个包含八行的文本文件

$ cat testfile
01-alpha
02-bravo
03-charlie
04-delta
05-echo
06-foxtrot
07-golf
08-hotel

运行 bisect 0 < testfile 将打印输入的前半部分

$ bisect 0 < testfile
01-alfa
02-bravo
03-charlie
04-delta

假设这成功了,你想尝试包括两行。

运行 bisect 00 < testfile 将打印文件的前四分之一

$ bisect 00 < testfile
01-alfa
02-bravo

如果这没成功,你可能想尝试

bisect01 <testfile

这将打印第二四分之一

$ bisect 01 < testfile
03-charlie
04-delta

继续运行 bisect 010 < testfile 将打印第 3-8 行(在这种情况下仅第 3 行)

$ bisect 010 < testfile
03-charlie

如果这成功了,你已确定 03-foxtrot 是你原始列表中的“问题”条目。

一般原则是在某种类型的 shell 一行式或一次性脚本中使用 bisect 并连续运行它,当事情正常时添加 0,当它们失败时将最后一个 0 切换为 1。

实验

bisect 的行为一开始可能难以理解。为了获得感觉,运行一个示例文件,逐步建立选择字符串以查看哪些被选中,可能会有所帮助。

对于长列表,comm(公共条目)命令与 bisect 结合使用,有助于确定排除的行。

$ comm testfile2 <(bisect 101 < testfile2)`
abrupt
clam
cloth
eggs
elfin
fanatical
future
giants
glow
group
guess
messy
object
puncture
replace
		silk
		special
		sticks
store
thoughtless
troubled
unable
zippy
zoom

反转

由于需要不断增加的测试条目列表的情况很常见,因此 bisect 有一个 --invert 标志,它只是简单地抑制所选行,而不是有选择地打印它们。

比较

$ bisect 01 < testfile
03-charlie
04-delta

$ bisect -i 01 < testfile
01-alfa
02-bravo
05-echo
06-foxtrot
07-golf
08-hotel

动机

包含越来越大的输入直到重现错误通常是一种隔离错误的有用方法。可以使用 bisect 来获取输入列表,并快速搜索直到找到问题输入。

在极端情况下,错误可能只在两个特定的输入同时出现时才会显示。在这种情况下,可以使用 bisect 来隔离其中一个输入,然后与 cat 结合使用,以找到其麻烦的伴侣。

具体来说,作者在 Ruby 中的测试用例中遇到了麻烦,其中一个测试在运行整个套件时失败,但在单独运行时不会失败,因为另一个测试更改了一些全局状态。可以使用 bisect 来识别另一个操纵状态的测试,这将有助于了解正在更改的内容以及需要正确隔离的内容。

bisect 的动机案例是一个附带预构建库的游戏,没有这些库游戏会崩溃,但是包含所有库时也会崩溃。bisect 帮助确定了必须包含在 LD_LIBRARY_PATH 中才能运行游戏的库子集。

依赖关系

~1MB