1

有谁知道以下两种情况下输出差异的原因?

alias的输出与OSXls上 alias 的输出不同。dir在 PowerShell 帮助中显示的示例中Help Get-Content -Examples

dir ./*.txt | foreach {Get-Content $_ -Head 1; Get-Content $_ -Tail 1} 

按照示例工作。但是,如果dir替换为ls

ls ./*.txt | foreach {Get-Content $_ -Head 1; Get-Content $_ -Tail 1} 

返回一个错误:

ls: ./*.txt: 没有这样的文件或目录

上述两种情况在 Windows 10 上的 PowerShell v5 中给出了相同的结果。

这个观察是一个错误吗?

4

2 回答 2

3

为标准 Unix 实用程序命名的纯 Windows版本中的内置别名被有意排除在跨平台版本之外,以免影响(覆盖)它们。

注意:从 PowerShell Core v6.0.0-alpha.10 开始就是这样,但是这个设计决定引起了争议 - 在这里找到讨论。一个值得注意的缺陷是 PowerShell 在调用外部
实用程序 时不执行 globbing ,因此,例如,在 Bash 中,类似的东西不会像在 Bash 中那样工作。ls *.txt

ls因此, Windows 原生版本中内置的alias内置于 Linux 和 macOS 版本中,因为标准实用程序/bin/ls应该优先。

相比之下, - 由于与任何标准 Unix 实用程序名称不冲突 - 在所有dir版本中都是内置别名(并且在 Windows 上指的是)。Get-ChildItem

当 PowerShell 仅适用于 Windows 时,添加诸如ls(for Get-ChildItem) 和cat(for Get-Content) 之类的别名是对来自 Unix 背景的人们的一种认可。
在 Windows 上,这些命令名称没有预定义的含义,但在类 Unix 系统上,它们会影响标准实用程序 (CLI),从而导致潜在的意外行为。

安全、便携的方法是坚持:

  • 使用完整的 cmdlet 名称而不是别名。
  • 和/或仅基于cmdlet名称使用别名(而不是基于旧命令名称,例如lsor dir)。

PowerShell 具有从 cmdlet 名称派生的别名的命名约定,将每个批准的动词(例如Get-and Copy-)映射到批准的别名前缀(例如gand cp) - 请参阅https://msdn.microsoft.com/en-us/library/ms714428( v=vs.85).aspx

如果对给定命令名称所指的内容有疑问,请使用Get-Command <name>(或gcm <name>)。

于 2016-10-04T04:09:49.627 回答
1

您似乎在调用命令/bin/ls( /usr/bin/ls?) 而不是 PowerShell 别名ls,即使别名应优先于外部命令。验证别名是否已实际定义:

Get-Alias -Name ls
于 2016-10-03T09:18:15.230 回答