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
不起作用,因为<
保留供将来使用。
有什么建议么?
等价于</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 /c
和NUL
代替/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在管道中枚举集合(例如数组),即将元素一一发送。根据定义,空集合没有元素,因此没有任何内容可发送。
归档时间: |
|
查看次数: |
398 次 |
最近记录: |