我在想,這個Bash命令是否可以轉換為PowerShell:
openssl s_client -showcerts -connect host: port </dev/null 2> /dev/null | openssl x509 -noout -dates
當前的腳本(不作業):
.openssl s_client -showcerts -connect host:port 2>$null | .openssl x509 -noout -dates
缺少的</dev/null使它無限期地等待輸入。是否有一個PowerShell的替代語法?
<$null不起作用,因為<被保留給未來使用。
有什么建議嗎?
uj5u.com熱心網友回復:
與</dev/null相當的是@() | ...,正如以下簡化的例子所示:
#等同于Bash中的`cat -n </dev/null`,例如。
@() | cat -n
從PowerShell 7.2開始,PowerShell完全不支持
<運算子;[1] 要發送外部程式通過其stdin流看到的資料,必須piped(|)給它,如上所示。插入一個空的陣列(
@())可以有效地提供沒有的stdin輸入,[2]就像</dev/null在POSIX-compatible shells中一樣。
注意,用管道輸送''或"`0" / [char] 0不會起作用,因為PowerShell總是在資料上添加一個換行符,它總是作為文本發送。
然而,可能存在一個額外的問題:
你的具體命令將兩個外部程式與一個PowerShell管道連接起來,這會有無意中修改被流傳的資料的風險,因為這總是涉及到將第一個行程的輸出解碼為文本,在將其發送到第二個行程之前重新編碼為文本--見這個答案了解更多資訊。
解決方法是呼叫平臺原生 shell的 CLI,其|運算子可以不加修改地傳輸資料;平臺原生 shell 也允許使用<:
在Windows上,平臺原生 shell 允許使用 在Windows上,使用 在Unix-like平臺上,使用 [1] 嘗試使用 [2] 原因是PowerShell在管道中列舉集合(如陣列),也就是說,它將元素一個一個地送出。根據定義,一個空的集合沒有任何元素,所以沒有任何東西可以發送。
標籤:<。
cmd /c和NUL來代替/dev/null:cmd /c 'openssl s_client -showcerts -connect host: port <NUL 2>NUL | openssl x509 -noout -dates'
sh -c(/dev/null可以原樣使用):sh -c 'openssl s_client -showcerts -connect host: port </dev/null 2>/dev/null | openssl x509 -noout -dates'
<時的錯誤資訊提到了 "保留給未來使用",但是不知道這個運算子是否會被實作,鑒于管道涵蓋了它的功能,我認為機會很小。
