Калашмат Автомашникова (ak_47) wrote,
Калашмат Автомашникова
ak_47

Category:

МощнаяОболочка

На прошедших рожденственских каникулах наконец дошли руки посидеть с PowerShell. Тем более что последняя версия мигрировала на .NET Core и полностью кроссплатформенная. Все последующие версии тоже будут только на .NET Core.

У меня мало опыта с .NET, трогал пару раз в прошлом, но несерьёзно, поэтому было интересно что и как там сейчас. Я долго не брался за PowerShell хотя видел как многие пользуются им и фанатеют. Думал, ну может это как VIM: или ненависть или любовь до гроба, посередине почти не бывает. Для меня лично причины игнорировать PowerShell были такие (забегая вперёд, все эти опасения не оправдались):
  1. Странный и слишком избыточный синтаксис, который отпугивает. Кажется что нормальный человек все эти Get-ChildItem и New-ItemProperty (да ещё и с миллионом параметров каждый) никогда не выучит. И руки обломаются писать такую колбасу на каждую ерунду в шелле.

  2. Необходимость серьёзно разбираться с .NET если хочется нормальной производительности.

  3. Лень и сила привычки. Тем более что под Виндой я легко себе могу сделать Linux-подобную среду, а вот наоборот - нет. Поэтому лучше уж сразу инвестировать в bash и GNU toolchain и пользоваться ими везде, чем под каждую платформу учить уникальные вещи.
В качестве упражнения я решил пройти Advent Of Code за один из прошлых годов используя лишь PowerShell. Читать мегабайты мануалов довольно скучно и малопродуктивно, а практические задачи порешать это именно то, что надо. The proof is in the pudding, как говорится.

Итоги:

Ни одно из вышеперечисленных опасений не оправдалось:
  • Несмотря на длинные имена команд, в PowerShell предопределены алиасы на всё что используется чаще всего. Поэтому особо много писать не требуется. В 98% случаев я не пользовался полными именами, хватало алиасов.
  • Множество параметров тоже не пришлось зубрить, т.к. шелл поддерживает Tab-completion. Причём, он довольно умный и сначала предлагает наиболее релевантные параметры.
  • За все 25 задач в Advent Of Code в собственно .NET пришлось залезть лишь пару раз: 1) хотел сделать настоящий двумерный массив, а не jagged array; 2) надо было использовать regexp чуть менее тривиальный.
В целом очень понравилось, буду продолжать пользоваться. Фактически, это полноценный язык программирования с несколько странным синтаксисом. Много хороших заимствований из других скриптовых языков, всё очень удобно. Если уж так получилось что чего-то не хватило, то можно пользоваться любыми .NET классами напрямую, не надо искать никаких левых приблуд.

То, что удивило или не понравилось:
  1. Неожиданностью было то, что округление целых не как в С/С++, а Round half to even. Т.е., число округляется до ближайшего чётного целого. Например, 1.5 и 2.5 будут округлены как 2.

  2. Непоследовательный синтакс для вызовов встроенных шелловских функций и .NET методов. Например:
    PowerShell function call:
    Foo -param1 "a" -param2 "b"
    или с неявными параметрами:
    Foo "a" "b"
    Но при этом:
    $a = [math]::Truncate(7/2)
    Иногда есть скобки, иногда нет.

  3. Недоделанная работа с unsigned integers. Такой код приводит к ошибке: [uint32]$a = 0xffffffff. Обходится это таким уродством: [uint32]$a = "0xffffffff". Надеюсь в будущем исправят.
То, что понравилось:
  1. Новый подход к шеллу: всё объект. Для программиста это родная среда, не надо заниматься утомительным расковыриванием текста как часто приходится делать в bash. Например, чтобы показать в рабочей директории все файлы размером больше 10К, отсорторованными по дате создания:
    gci | where Length -gt 10kb | sort CreationTime
    gci это алиас Get-ChildItem. При этом та же команда Get-ChildItem будет работать на любой древовидной структуре, файловая система или ещё что.

  2. Приятный синтаксический сахар. Например, switch на стероидах:
    switch -file $somePath {
        1     { echo "1" }
        "two" { echo "2" }
        { $_ -like "wtf"}    { echo "hm.." }
        { $_ -in "a",$b,42 } { echo "got $_" }
        default { throw "error: $_" }
    }
    Каждая строка в файле будет обработана в этом switch'е.

    Типа, лямбда:
    $foo = { param($x) $x * 2 }
    &$foo 2
    4
    Можно передавать $foo в другие функции и пр.

  3. Нет 40-летней legacy как в bash. Всё унифицировано, все команды и параметры работают везде одинаково. Поэтому учить приходится довольно мало при кажущемся богатстве синтаксиса и объектов.
В заключение могу сказать что Microsoft провела последние 20 лет в глухой несознанке. Теперь потихоньку начинают выходить из транса.

Mirrored from DreamWidth. Comments: comment count unavailable
Tags: puter
Subscribe

  • Сверхпроводимость

    Как раньше человек узнавал новости? Для начала, ему самому надо было этого захотеть. Затем, что-нибудь сделать: купить газету или включить телевизор…

  • Mission accomplished

    У нас в компании есть небольшое отделение в Остине, Техас. Само собой, многие пишут во внутренних блогах о том как справлялись с морозами и снегом,…

  • Маниловщина

    Навеяно обсуждением в прошлом посте. Каждое поколение носится с очередной технологией, которая призвана изменить мир. Обычно лет через 10, но планы…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 8 comments