All*_* Xu 5 linux powershell powershell-core
我有以下未解答的问题,并且我正在寻找解释 Linux 环境中 LF 与 CRLF 行结尾的 PowerShell 核心要求的文档。
1- PWSH Core 可以处理带 CRLF 的文件吗?
2-当我运行以 LF 行结尾的 ps1 文件时,它可以调用另一个以混合 CRLF 行结尾的 ps1 文件吗?
3- PWSH 行结束要求是否已记录并在所有 Linux 发行版中保持一致?
我问上述问题是因为 PowerShell 诞生于 Windows 环境中,并且我希望它能够以某种方式容忍 LF 与 CRLF 的差异。
在线文档的链接将会有很大帮助。我进行了搜索,令人惊讶的是,我找不到任何东西。
stackprotector的社区 wiki 答案,受到Ben Voigt提供的链接的启发,提供了您的问题答案的要点。
让我一一回答你的问题来补充一下:
我正在寻找解释 Linux 环境中 LF 与 CRLF 行结尾的 PowerShell 核心要求的文档。
截至撰写本文时,似乎还没有此类文档:
`r CR) 和`n(LF) ,但没有明确讨论它们作为换行符/序列(换行符)的潜在功能;该主题使用术语“换行符”来指代 LF 字符,特别是)。1- PWSH Core 可以处理带 CRLF 的文件吗?
是 -两个PowerShell 版本- 旧版、随 Windows 提供、仅限 Windows 的Windows PowerShell版本(其最新和最终版本为 v5.1),以及跨平台、按需安装的PowerShell(核心版) )版本 (v6+) -可互换地对待 CRLF 和 LF 换行符- 两者都涉及读取源代码和读取文件[1] - 即使两种换行符格式混合在一个文件中。
虽然没有这样的记录,但 PowerShell 一直以这种方式工作,并且考虑到其对向后兼容性的承诺,这一点不会改变(在这种情况下,这绝对是一件幸事,因为 PowerShell(核心)现在是跨平台的,并且必须能够在类 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
Run Code Online (Sandbox Code Playgroud)
2-当我运行以 LF 行结尾的 ps1 文件时,它可以调用另一个以混合 CRLF 行结尾的 ps1 文件吗?
是的 - 这是从上面得出的。
但是,特殊注意事项适用于类 Unix 平台上基于shebang行的 PowerShell 脚本:
这种独立的 shell 脚本(可以说不需要有扩展名)首先由类 Unix 平台上的系统.ps1读取,因此需要 shebang 行(根据定义是第一行)以仅 LF ( ) 换行符,因为在类 Unix 平台上只有 LF 本身才被视为换行符。[2]然后,所有剩余的行都只能由 PowerShell 读取,并且像往常一样接受 CLRF 和 LF 的任何组合;例如:"`n"
# 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
Run Code Online (Sandbox Code Playgroud)
pwsh在实践中,不仅是由于PowerShell(核心)CLI的启动成本相当大,而且还由于自 PowerShell 7.2.6 起的几个错误,基于独立 shebang-line 的 PowerShell 脚本 - 这些脚本主要用于从 PowerShell外部调用- 很少见。
3- PWSH 行结束要求是否已记录并在所有 Linux 发行版中保持一致?
不,它没有记录在案。
是的,正如上面所暗示的,它不仅在Linux发行版上是一致的,而且在所有支持的平台上都是一致的。
[1] 例如,即使是仅 CR 的换行符(如在早已过时的旧 mac OS 版本中使用的那样,因此现在应避免使用),也可以在 PowerShell 源代码中识别Get-Content,但不能被 识别Measure-Object -Line。
[2] 如果第一行以 CRLF 结尾,则 CR ( \r) 被保留为该行的一部分,因此作为目标可执行路径或传递给它的最后一个选项的一部分,这会中断调用 - 请参阅此答案以了解真正的情况-这个问题的生活表现。
| 归档时间: |
|
| 查看次数: |
979 次 |
| 最近记录: |