PowerShell Core能否在Linux环境中处理以CRLF行结尾的ps1文件



我有以下未回答的问题,我正在寻找解释Linux环境中LF与CRLF行结尾的PowerShell核心要求的文档。

1-PWSH Core可以用CRLF处理文件吗?

2-当我运行一个以LF结尾的ps1文件时,它能调用另一个以混合CRLF结尾的ps1文件吗?

3-PWSH行结束要求是否有文档记录并在所有Linux发行版中保持一致?

我之所以提出上述问题,是因为PowerShell诞生于Windows环境中,我希望它能够以某种方式容忍LF与CRLF之间的差异。

链接到在线文档将是一个很大的帮助。我确实搜索了一下,但令人惊讶的是,我没有找到任何。

只保留评论中提到的链接的内容(来源):

行尾

包括ISE在内的Windows编辑器倾向于在每行末尾使用回车符和换行符(rn`r`n)。Linux编辑器仅使用换行符(n`n)。

如果唯一读取文件的是PowerShell(在任何平台上),那么行结尾就不那么重要了。但是,如果脚本设置为可在Linux上执行,则必须包含shebang,并且使用的换行符必须仅为换行符。

例如,如下创建的名为test.ps1的必须使用n来结束行:

#!/usr/bin/env powershell 
Get-Process 

第一行是shebang,它让Linux知道在执行shell脚本时要使用哪个解析器。

创建后,chmod可用于使脚本在PowerShell之外可执行:

chmod +x test.ps1

根据此,PowerShell可以同时处理-CRLF和LF,即使在同一文件中也是如此。唯一的例外是shebang:它必须以LF结束。

stackprotector的社区wiki答案受到Ben Voigt提供的链接的启发,为您的问题提供了答案的要点。

让我通过逐一回答您的问题来补充它:

我正在寻找解释在Linux环境中结束的LF与CRLF行的PowerShell核心要求的文档。

截至本文撰写之时,似乎没有此类文档:

  • 概念性about_Special_Characters帮助主题分别讨论了`r(CR)和`n(LF),但没有明确讨论它们作为换行符/序列的潜在功能(换行符;该主题使用术语"换行"来指代LF字符)

1-PWSH Core可以用CRLF处理文件吗?

是-两个PowerShell版本-遗留版本,随Windows一起提供,仅限WindowsWindows PowerShell版本(其最新和最终版本为v5.1),以及跨平台,按需安装,PowerShell(Core)版本(v6+)-可交换地处理CRLF和LF换行符-无论是读取源代码还是读取[1]-即使这两种换行符格式混合在单个文件中也是如此
虽然没有这样的文档,但PowerShell一直以这种方式工作,并且,鉴于其对向后兼容性的承诺,这不会改变(在这种情况下,这绝对是一件幸事,因为PowerShell(Core)现在是跨平台的,并且必须能够在类Unix平台上仅使用LF换行符处理文件)。

以下示例说明了这一点——它们在所有支持的平台上都是相同的("`n"创建一个仅LF的换行符,"`r`n"创建一个CRLF换行符):

# Read a file with mixed newline formats.
PS> "one`ntwo`r`nthree" > temp.txt; (Get-Content temp.txt).Count; Remove-Item temp.txt
3
# Execute a script with mixed newline formats.
PS> "'one'`n'two'`r`n'three'" > temp.ps1; . ./temp.ps1; Remove-Item temp.ps1
one
two
three

2-当我运行一个以LF行结尾的ps1文件时,它能调用另一个以混合CRLF行结束的ps1吗?

是-这是从上面开始的
但是,特殊注意事项适用于类Unix平台上基于shebang行的PowerShells脚本

  • 这样的独立shell脚本-不需要也不应该有.ps1扩展-首先由类Unix平台上的系统读取,因此需要shebang行-定义为第一个行-以仅LF("`n")换行符终止,因为在类Unix平台上将只有LF本身被视为换行符[2]然后PowerShell只读取所有剩余的行,然后像往常一样接受CLRF和LF的任何混合;例如:

    # Run on any Unix-like platform - note that `n alone must end the first line.
    PS> "#!/usr/bin/env pwsh`n'one'`r`n'two'" > temp; chmod a+x temp; ./temp; Remove-Item temp
    one
    two
    
  • 在实践中,不仅由于PowerShell(Core)CLIpwsh的启动成本不小,而且由于PowerShell 7.2.6中的几个错误,基于shebang行的独立PowerShell脚本(主要用于从外部调用)非常罕见。

3-PWSH行结束要求是否有文档记录并在所有Linux发行版中保持一致?

不,它没有文档记录
是的,正如上面所暗示的,它是一致的,不仅在Linux发行版之间,而且在所有支持的平台之间。


[1]即使是仅CR的换行符(在早已过时的旧版macOS版本中使用,因此现在应该避免使用)也可以在PowerShell源代码和Get-Content中识别,但不能被Measure-Object -Line识别

[2]如果第一行以CRLF结束,CR(r)将保留作为行的一部分,因此作为目标可执行路径的一部分或传递给它的最后一个选项,这会中断调用-有关此问题的真实表现,请参阅此答案

像我一样精明:

我在PowerShell v2-v3上工作。

任何一种形式的换行符在PowerShell中都是可互换的。

这门语言受到了Unix的大量影响。能够支持这两种形式的换行符对许多团队成员来说都是非常重要的。能够从一开始就支持它,防止了仅仅因为它被复制到mac或linux并保存在错误的编辑器中而导致脚本无法运行的可能性。

这个功能的重要性已经被一次又一次地证明了,而且现在PowerShell Core已经成为一件重要的事情(因为上面列出的场景要常见得多),它显然变得至关重要。我敢打赌,只要PowerShell是一种语言,这将是PowerShell脚本的行为。

就shebang文件而言,这并不是这个规则的例外。使用shebang文件,Unix逐行读取文件,然后将其发送到解释器。回车超出了预期范围,而不是PowerShell的

希望这有助于揭示一些事情。

最新更新