使用 PowerShell 启动程序,无需等待输入

Gho*_*per 3 powershell stdin exit

我想知道这个 Bash 命令是否可以转换为 PowerShell:

openssl s_client -showcerts -connect host:port </dev/null 2>/dev/null | openssl x509 -noout -dates
Run Code Online (Sandbox Code Playgroud)

当前脚本(不起作用):

.\openssl s_client -showcerts -connect host:port 2>$null | .\openssl x509 -noout -dates
Run Code Online (Sandbox Code Playgroud)

缺失</dev/null使其无限等待输入。该语法是否有 PowerShell 替代方案?

<$null不起作用,因为<保留供将来使用。



有什么建议么?

mkl*_*nt0 5

等价于</dev/null@() | ...如以下简化示例所示:

# Equivalent of `cat -n </dev/null` in Bash, for instance.
@() | cat -n
Run Code Online (Sandbox Code Playgroud)
  • <从 PowerShell 7.2 开始,PowerShell 根本不支持该运算符;[1] 要发送外部程序通过其标准输入流看到的数据,必须通过管道( |) 传递给外部程序,如上所示。

  • 管道空数组( @()) 实际上提供标准输入[2]</dev/null与POSIX 兼容 shell 中一样。

请注意,管道''"`0"/[char] 0不起作用,因为 PowerShell 总是在数据中附加换行符,而数据总是以text形式发送。

但是,可能还有一个额外的问题

您的特定命令使用PowerShell管道连接两个外部程序,这存在无意中修改正在传输的数据的风​​险,因为这总是涉及将第一个进程的输出解码为文本,并在将其发送到第二个进程之前重新编码为文本流程 - 请参阅此答案以获取更多信息。

解决方法调用平台本机 shell的 CLI,其|操作符会流式传输未经修改的数据;平台本机 shell 还允许使用<

Windows上,使用cmd /cNUL代替/dev/null

cmd /c 'openssl s_client -showcerts -connect host:port <NUL 2>NUL | openssl x509 -noout -dates'
Run Code Online (Sandbox Code Playgroud)

在类Unix平台上,使用sh -c/dev/null可以按原样使用):

sh -c 'openssl s_client -showcerts -connect host:port </dev/null 2>/dev/null | openssl x509 -noout -dates'
Run Code Online (Sandbox Code Playgroud)

[1] 尝试使用时的错误消息<提到“保留供将来使用”,但不知道该运算符是否会被实现,并且考虑到管道涵盖了其功能,我想说机会很小。

[2] 原因是PowerShell在管道中枚举集合(例如数组),即将元素一一发送。根据定义,空集合没有元素,因此没有任何内容可发送。