Сегодня я начну издалека. Давно-давно у операционных систем семейства DOS был простой интерпретатор командной строки под названием COMMAND.COM, а у зародившегося в 70-х годах прошлого века семейства UNIX — командная оболочка Bourne Shell (sh). Шло время, для Unix/Linux устаревший sh сменил более совершенный bash, по сей день являющийся стандартным интерпретатором на всех -nix системах.

В среде Windows тоже произошла небольшая революция — появилось новое ядро Windows NT, которое, несмотря на полное техническое избавление от наследия DOS-эпохи, имело стандартным интерпретатором команд новый cmd.exe, который был… функционально просто повторением COMMAND.COM, только без DOS. Во имя обратной совместимости, ага. То есть, в то время, как линуксоиды могли автоматизировать ОС используя довольно современный (на тот момент) скриптовый язык bash, пользователям (ну, администраторам) Windows предлагалось продолжать долбиться в древний COMMAND.COM.

Конечно, Microsoft понимала ситуацию и пыталась изменить её к лучшему, например, разработав теоретически многофункциональный, но на практике жуткий Windows Scripting Host (WSH), который, в частности, полагался на другую жутковатую технологию — COM. Ни то, ни другое толком не прижилось, хотя и поставляется с Windows до сих пор. Впрочем, как и дремучий cmd.exe. Конечно, можно было писать программы для автоматизации, что большинство и делало. Однако, разница в требованиях между языком программирования и скриптовым языком автоматизации довольно существенна.

Тут надо отметить, что bash на самом деле тоже не подарок и обладает довольно стрёмным, почти эзотерическим синтаксисом. Чего стоит только перевёрнутые наоборот директивы, которые завершают нормальные: if ... fi, case ... esac и тому подобная феерия.

Затем, в то время как bash остановился в своём развитии, у Microsoft появилась и успешно развилась замечательная технология .NET, на основе которой инженеры корпорации создали (а к сегодняшнему моменту довели до ума) принципиально новый, современный скриптовый интерпретатор PowerShell. Он удачно спроектирован именно для создания сценариев автоматизации и действительно хорош, в том числе благодаря своей глубокой и прозрачной интеграции с .NET Framework. В общем, мне очень понравилась эта разработка. Но на Linux, основной платформе для серверной автоматизации, его, по понятным причинам, не было. До недавнего времени.

Не так давно я обнаружил замечательный open-source проект Pash, который полностью переносит ядро PowerShell как компилируемый в IL-сборки проект, который затем может быть запущен без всяких изменений как на Windows (но тут он уже есть), так и на Linux с помощью Mono. Тут надо отдать должное и самой Microsoft, которая реализовала большую часть своего скриптового движка на .NET, что сделало его очень легко портируемым. Это всё позволяет без проблем использовать PS-скрипты на всех современных платформах. Хотя формально проект находится в альфа-стадии, я успешно протестировал Pash на своих скриптах, запуская их на серверах под Debian и CentOS, и не обнаружил каких-либо проблем ни с одним из них.

Авторы проекта предлагают собирать проект из git, что, в общем, несложно сделать, учитывая, что проект сделан на .NET. Но я решил воспользоваться преимуществом управляемых NET-сборок, которые могут быть без изменений запущены на любой машине с .NET/Mono, и прекомпилировал проект. Теперь его достаточно распаковать и запустить Pash.exe. Распакованный командный интерпретатор занимает всего 1 мегабайт дискового пространства.

Для удобства использования на Linux предлагаю создать следующий скрипт как /usr/bin/pash (не забудьте установить +x для файла):


#!/usr/bin/env sh
/usr/bin/mono /opt/pash/Pash.exe "$@"

Где /opt/pash — путь к директории, куда вы распаковали дистрибутив. Для таких штук я традиционно использую /opt. Можно так же вместо скрипта запуска создать алиас в профиле bash, что будет более «правильно»; или сохранить скрипт запуска в директории программы, а /usr/bin/pash сделать символьной ссылкой (с помощью ln -s) на этот скрипт. В общем, после этих действий PS-скрипт можно простой командой pash script.ps1.

Ещё одним хорошим кроссплатформенным решением на основе .NET стало больше, что меня, как большого поклонника этой технологии не может не радовать.

P.S. Всем вопиющим «нахрена на уютненьком Линуксе костыль корпорации зла» предлагаю пройти и не портить праздник.

comments powered by HyperComments