`[[[[abc]]` 生成"不完整令牌"错误 (来自 #12903 的回退)
作者: Nahor创建于 2026年8月11日更新于 2026年8月27日
问题
在 4.8.1 中:
$ echo [[[[abc]
[[[[abc]在 master (提交 PR #12903 的 abaf54f0f8e2f331e4c3038c1cfb21cfbdcc7a04 commit 中):
$ echo [[[[abc]
fish: Unexpected end of string, square brackets do not match
echo [[[[abc]
^说明:
- 然而,此问题从来没有解决:
$ echo [[[[abc # 无闭合 ]
fish: Unexpected end of string, square brackets do not match
echo [[[[abc
^- 这与 #2485 有关,可以归结为:
- 什么时候
[是特殊的?什么时候它只是一个普通字符?*
- 在
$var1[$var2[...和(...)[...中,它显然是特殊的,而第一个是 PR 所修复的内容。 - 在
[[...中,它显然不是(尽管可以争论,它可能是用于字符范围/类的字符串匹配正则表达式...)。 - 在
a[b[...中,情况不明确。通常它没有意义: - 目前,
set依赖于它是特殊的(set var[1 2] ...),至少在第 1 层嵌套中。 - 但
echo -e \\e[4mfoo失败,因为缺少了],尽管这应该是有效的。 - 如果
[有时是特殊的,有时不是,那么混合情况会如何,例如$var[1 b[...] 2(]应该关闭$var[吗?从技术上讲,应该是第一个],因为第二个[没有特殊含义,但用户可能会期望第二个)。
解决方案
我认为回退是小恶,至少目前是如此。PR 修复了一个有效的用例。如果需要不平衡的括号,可以使用引号来避免错误。引号已经是必要的,如果没有 ]。
内容来源: fish-shell/fish-shell