【发布时间】:2018-01-11 21:35:16
【问题描述】:
我有几个 PowerShell 脚本,我想直接从 Cygwin 中的 Bash shell 作为命令调用它们。例如,如果我编写一个文件名为 Write-Foo.ps1 的脚本,我想从任何工作目录将其作为命令执行:
$ Write-Foo.ps1 arg1 arg2 ...
为此,我将脚本添加到我的 PATH,使其可执行,并在文件开头包含以下解释器 shebang/hashbang:
#!/usr/bin/env powershell
Write-Host 'Foo'
...
这是 env 实用程序的常见(ab)使用,但它将脚本与 Cygwin 的路径前缀 (/cygdrive/c/...) 分离,位于至少对于解释器声明。
这可以启动 PowerShell,但系统将文件作为 Cygwin 格式的路径传递,PowerShell 不理解,当然:
术语“/cygdrive/c/path/to/Write-Foo.ps1”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
MSYS (Git Bash) 似乎可以正确转换脚本路径,只要文件路径不包含空格,脚本就会按预期执行。有没有办法通过 Cygwin 中的 shebang 直接调用 PowerShell 脚本?
理想情况下,如果可能的话,我还想从脚本名称中省略 .ps1 扩展名,但我知道我可能需要忍受这个限制。如果可能,我想避免手动别名或包装脚本。
【问题讨论】:
-
你试过PowerShell Core 6.0 by any chance? It was just released yesterday。他们专门将位置参数 0 从
-Command更改为-File以使其工作。 -
是的,直到 PS 6 才真正提供 shebang 支持,这实际上距离发布不到一周。鉴于 PS 6(和 .Net Core)缺乏的东西,我仍然不会称其为生产就绪。我认为这是“不是现在,而是最终”。
-
@briantist 哦啦啦...看起来很有趣。我还没有尝试过...需要一些时间来玩。不过,我希望 v6 不会解决这个特定问题。我觉得这是 Cygwin 环境固有的挑战,可能需要在控制到达 PowerShell 之前处理。
-
@CyRossignol 我不能肯定地说新版本会解决这个问题,但是除了以 shebang 为中心的变化之外,它在 Linux/MacOS 上得到了支持,因此它对路径的理解和支持是更新以支持这些平台。但实际上,您收到的错误消息是,因为它传递了一条到
-Command的路径,这不起作用。也许您可以将powershell别名为隐式调用powershell -File?我对 bash 别名的了解不够多,不知道在这种情况下这是否可行或是否可行。 -
@briantist 谢谢,很好的信息和建议。该别名将起作用,但我仍然需要将路径传递给脚本,我希望避免这种情况。有趣的是,我刚试了
powershell Write-Foo,就达到了这个目的。因为我将该脚本放入环境的 PATH 中,所以 PS 似乎找到了它并接受该脚本作为有效命令(即使没有扩展名)。我仍然想让shebang工作,但这种方式已经好多了。
标签: bash shell powershell cygwin shebang