双尖括号模式
Double angle bracket mode
我使用的是 PowerShell 7.1.3,在我的提示中输入单引号时发现了一个奇怪的行为:
PS: '
>>
>>
提示的样式为 >>
,无论我键入什么,都不会执行任何内容(或者看起来就是这样)。我在想:
- 这是通过在 shell 上输入
'
激活的,还是副作用?
- 这种模式不知何故被调用?
- 此模式对特定情况有用吗?
Is this activated by entering '
on the shell, or is this a side effect?
这是输入不匹配的 '
作为命令的 故意 副作用,是的。
从技术上讲,它不是 PowerShell 本身,而是 PSReadLine 模块(它随 PowerShell 7 一起提供,默认情况下启用)。
PSReadLine 提供了许多命令行编辑改进 - 包括语法突出显示、可自定义的制表符和菜单完成以及 多行编辑 - 它通过不断地输入你的(部分)输入 PowerShell's parser,然后使用解析器返回的结果提供正确的语法高亮等
因此,当您在键入单个 '
后按 [Enter]
时,PSReadLine 会像这样将您的输入发送到解析器:
# Parse the input script the same way PSReadLine would
$ParserErrors = @()
$AST = [System.Management.Automation.Language.Parser]::ParseInput("'", [ref]$null, [ref]$ParserErrors)
# Let's inspect any parser errors
$ParserErrors
如果您 运行 在 PowerShell 7.1.3 中执行此操作,您将看到报告了以下错误:
Extent ErrorId Message IncompleteInput
------ ------- ------- ---------------
' TerminatorExpectedAtEndOfString The string is missing the terminator: '. True
注意错误的最后 属性,IsInputIncomplete
- PSReadLine 发现您在提示中输入的内容 不完整 - 因此它假设您还没有写完命令并在下一行为您继续提示。
[...] no matter what I type, nothing gets executed
这不完全正确 - 如果您输入的内容 完成 输入(例如,使其再次成为有效的 PowerShell),它会让您提交它 - 在您的情况下将通过输入结尾 '
:
Is this mode called somehow?
不知道,我倾向于将 >>
视为“提示持续指标”,但它本身并不是真正独特的 模式 。
Is this mode useful for a specific case?
好吧,如上所示,它可以防止您尝试执行语法无效或不完整的代码,我认为这本身就非常有用。
在提示符下进行多行编辑的整体能力,在我个人看来,PowerShell[=63=的最大优势之一] - 您可以开始制作小函数的原型并编写相当复杂的管道,而无需在编辑器之间来回切换。
作为 ,您还可以通过按 Shift+Enter
获得提示继续(至少在默认的 Windows 控制台主机中)- 无论现有输入是否不完整,这都有效与否。
如果愿意,您基本上可以在提示符下编写和编辑整个脚本。
我使用的是 PowerShell 7.1.3,在我的提示中输入单引号时发现了一个奇怪的行为:
PS: '
>>
>>
提示的样式为 >>
,无论我键入什么,都不会执行任何内容(或者看起来就是这样)。我在想:
- 这是通过在 shell 上输入
'
激活的,还是副作用? - 这种模式不知何故被调用?
- 此模式对特定情况有用吗?
Is this activated by entering
'
on the shell, or is this a side effect?
这是输入不匹配的 '
作为命令的 故意 副作用,是的。
从技术上讲,它不是 PowerShell 本身,而是 PSReadLine 模块(它随 PowerShell 7 一起提供,默认情况下启用)。
PSReadLine 提供了许多命令行编辑改进 - 包括语法突出显示、可自定义的制表符和菜单完成以及 多行编辑 - 它通过不断地输入你的(部分)输入 PowerShell's parser,然后使用解析器返回的结果提供正确的语法高亮等
因此,当您在键入单个 '
后按 [Enter]
时,PSReadLine 会像这样将您的输入发送到解析器:
# Parse the input script the same way PSReadLine would
$ParserErrors = @()
$AST = [System.Management.Automation.Language.Parser]::ParseInput("'", [ref]$null, [ref]$ParserErrors)
# Let's inspect any parser errors
$ParserErrors
如果您 运行 在 PowerShell 7.1.3 中执行此操作,您将看到报告了以下错误:
Extent ErrorId Message IncompleteInput
------ ------- ------- ---------------
' TerminatorExpectedAtEndOfString The string is missing the terminator: '. True
注意错误的最后 属性,IsInputIncomplete
- PSReadLine 发现您在提示中输入的内容 不完整 - 因此它假设您还没有写完命令并在下一行为您继续提示。
[...] no matter what I type, nothing gets executed
这不完全正确 - 如果您输入的内容 完成 输入(例如,使其再次成为有效的 PowerShell),它会让您提交它 - 在您的情况下将通过输入结尾 '
:
Is this mode called somehow?
不知道,我倾向于将 >>
视为“提示持续指标”,但它本身并不是真正独特的 模式 。
Is this mode useful for a specific case?
好吧,如上所示,它可以防止您尝试执行语法无效或不完整的代码,我认为这本身就非常有用。
在提示符下进行多行编辑的整体能力,在我个人看来,PowerShell[=63=的最大优势之一] - 您可以开始制作小函数的原型并编写相当复杂的管道,而无需在编辑器之间来回切换。
作为 Shift+Enter
获得提示继续(至少在默认的 Windows 控制台主机中)- 无论现有输入是否不完整,这都有效与否。
如果愿意,您基本上可以在提示符下编写和编辑整个脚本。