2 个不稳定版本
0.2.0 | 2019 年 3 月 15 日 |
---|---|
0.1.0 | 2019 年 3 月 14 日 |
在 #text-search 中排名第 42
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