elglin: (Default)
[personal profile] elglin
То, как повершелл ведет себя с возвратом из функций меня СУКА БЕСИТ.
Языки здорового человека либо строго типизируют возврат (C; внезапно bash), либо никак не типизируют (Python). В повершелле можно указать тип возврата директивой OutputType... но она ни к чему не обязывает, я могу указать String и вернуть int.
Далее, языки здорового человека (C, Python) имеют команду return - вот что ей дал, то функция и вернет. Языки здорового человека со странностями (VB, емнип Pascal) это делают путем присвоения значения возврата "имени функции". Шелл здорового человека (bash) умеет возвращать только код возврата - но там функции могут писать в stdout, для перехвата которого есть штатный конструкт (где-то здесь порылся срач между $() и ``).
Сраный повершелл возвращает все, что кем угодно было выведено в stdout ПЛЮС то, что вернули return - этакая ужасная помесь процедурного языка и шелла. Если было несколько такого дела, возвращается массив, элементами которого являются выводы - даже если этот вывод $null. Вот только что на выходе из функции, которая должна возвращать НИЧЕГО, я поимел @($null, $null) и с горящей задницей искал, откуда это лезет. Нашел и пофиксил, конечно, но осадок остался.

Мораль сей басни такова: если вы пишете на PSH не в шелл-стиле и не в BEGIN-PROCESS-END стиле, а в старом добром процедурном (если вы в анамнезе решеточник, питонист или, оужас, сишник), то внимательно следите за выводом. Вызов любого командлета или функции, которые хотя бы теоретически могут что-то вернуть, но который вам нафиг не нужен, должен быть либо присвоен мусорной переменной, либо отправлен конвейером в Out-Null. Иначе дебаггинг гарантирован.

Да, чтобы два раза не вставать, ну вот на хрена запилено пицот (ладно, 5 или 6) потоков вывода вместо старых добрых stderr и stdout, если нельзя сделать | Out-Verbose или | Out-Error , а только Write-Error или Write-Verbose - и это при том, что "конвейером объектов" размахивают все адепты.

(no subject)

Date: 2018-08-31 03:19 pm (UTC)
scif_yar: (Default)
From: [personal profile] scif_yar
>>работать с возвратом любой функции как с массивом - это, имхо, извращение.
-
вопрос привычки. Я пару раз так наябывался, что есть сервер с 1 сервисом foo1, а есть с двумя, foo1 и foo2. И ну его разбираться чего мне там вернут - один сервис или пачку.

(no subject)

Date: 2019-03-05 11:38 pm (UTC)
pan_2: (Default)
From: [personal profile] pan_2
Это пока у тебя не будет полтыщи объектов в возврате.

(no subject)

Date: 2019-03-07 06:17 pm (UTC)
pan_2: (Default)
From: [personal profile] pan_2
Тут есть нюанс в том, что Пош зачастую пытается упростить человеку жизнь (опять-таки - потому что он для этого и был задуман). В комменте ниже я привёл пример, где, в зависимости от количества возвращённых объектов, будет либо [object] либо [object[]]. Многие по незнанию на это напарываются.

(no subject)

Date: 2019-03-06 12:20 am (UTC)
pan_2: (Default)
From: [personal profile] pan_2
И да, рекомендую помедитировать над выводом
(gci $env:windir -Filter win*).Length
(gci -Path $env:windir -Filter winhlp*).Length
@(gci -Path $env:windir -Filter winhlp*).Length
Page generated Jan. 23rd, 2026 12:46 am
Powered by Dreamwidth Studios