我有以下未回答的问题,我正在寻找解释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)CLI
pwsh
的启动成本不小,而且由于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的。
希望这有助于揭示一些事情。