Канал PowerShell добавляет перевод строки
Я пытаюсь передать строку в STDIN программыбез любые завершающие переводы строки (если только эта строка на самом деле не заканчивается переводом строки). Я пытался погуглить, но я нашел только людей, пытающихся напечатать наприставка без завершающего перевода строки, в этом случаеWrite-Host
принимает параметр-NoNewLine
, Однако, чтобы передать его в другую программу, мне нужноWrite-Output
или аналогичный, который не имеет такого параметра. Теперь похожеWrite-Output
даже не проблема:
Z:\> (Write-Output "abc").Length
3
Но как только я передаю ее в другую программу и читаю там строку, я получаю дополнительный перевод строки. Например, я попробовал этот фрагмент Ruby:
Z:\> Write-Output "abc" | ruby -e "p ARGF.read"
"abc\n"
Я проверил, что полученная строкаabc\n
, То же самое происходит в некоторых других языках (по крайней мере, C #, Java и Python), поэтому я считаю, что это проблема с PowerShell, а не с языком, выполняющим чтение.
В качестве дальнейшего теста я заменилWrite-Output
сам с другим скриптом Ruby:
Z:\> ruby -e "Z:\> ruby -e "$> << 'abc'"
abcZ:\>
gt; << 'abc'"
abcZ:\>
(То есть точно нет\n
на сценарии STDOUT.)
Но опять же, когда я передаю это в другой скрипт:
Z:\> ruby -e "Z:\> ruby -e "$> << 'abc'" | ruby -e "p ARGF.read"
"abc\n"
gt; << 'abc'" | ruby -e "p ARGF.read"
"abc\n"
Я совершенно уверен, что это канал, который добавляет перевод строки. Как мне этого избежать? На самом деле я хочу иметь возможность контролировать, заканчивается ли ввод переводом строки или нет (включив его во вход или пропустив его).
(Для справки я также протестировал строки, которые уже содержат завершающий перевод строки, и в этом случае каналне добавьте еще один, так что я предполагаю, что он просто обеспечивает конечный перевод строки.)
Изначально я сталкивался с этим в PowerShell v3, но сейчас я использую v5, но проблема все еще остается.