Лекция Зачем спо в школе?

Вид материалаЛекция

Содержание


Лекция 6. Строка длиною в жизнь
6.2 Командная оболочка: основные понятия
6.3 Командная оболочка как инструмент
6.4 Командная оболочка как язык программирования
Подобный материал:
1   2   3   4   5   6   7   8   9   10   ...   22

Лекция 6. Строка длиною в жизнь


Существует широко распространенное заблуждение, согласно которому графический интерфейс якобы представляет собой высшую и последнюю стадию развития пользовательских интерфейсов, а (командная строка( --- это нечто примитивное и малополезное, если не устаревшее.

На самом деле, эта последовательность отражает не что иное, как порядок, с которым с двумя основными метафорами организации пользовательских интерфейсов познакомились пользователи персональных компьютеров. Вплоть до начала девяностых ПК были простыми и маломощными, поддержка графики и возможность комфортной работы с оконными графическими системами появилась на них недавно (даже в масштабе стремительно развивающейся информационно-технологической отрасли).

Однако за годы до этого графические интерфейсы уже широко применялись на рабочих станциях --- конечно, более дорогом, редком и специализированном оборудовании. Если быть точными, то обе концепции в их более или менее современном виде сформировались примерно в одно время.

В 1967-68 гг. Дуг Энгельбарт представил прототип т.н. WIMP-интерфейса, т.е. интерфейса, использующего понятия окон (windows), пиктограмм (icons), меню (menus) и указателей (pointers), являющихся ключевыми и для сегодняшних графических пользовательских сред.

В 1968-69 гг. Кен Томсон и Деннис Ричи представили первый релиз ОС UNIX, по сути, явившейся прототипом артикулированной системы современных понятий практической информатики, таких, как процессы и файлы, и содержащей непротиворечивый, логичный и лаконичный язык работы с соответствующими им сущностями, котоhый спустя полтора десятка лет стал стандартным пользовательским интерфейсом ОС. (Рубеж шестидесятых и семидесятых --- уже --- прошлого --- века вообще является "осевым временем" информатики и вычислительной техники...).

Разумеется, как одна, так и вторая метафорические системы появились не на голом месте, и их родословную можно проследить назад вплоть до истоков вычислительной техники: до коммуникационной панели первых компьютеров, как вещи твердой и весьма графической (или, во всяком случае, живописной) --- это конец сороковых, и до языков управления заданиями в первых программных планировщиках, загрузчиках и ОС--- это середина пятидесятых , соответственно. Отметим, что идея управления компьютером как "прибором" --- с помощью органов управления (неважно, "в железе" или нарисованных на экране) старше идеи "диалога" при помощи слов.

При этом, для большинства пользователей знакомство с "командной строкой" до недавнего времени отягощалось радикальным упрощением и изменением, которым язык стандартной оболочки ОС был подвергнут при разработке ОС для ПК (таких, как CP/M, MS-DOS (PC-DOS) и клонов последней). Ограничиваясь знакомством со средствами MS-DOS и ее командных файлов, о метафоре "командной строки" можно составить лишь весьма превратное и убогое представление.

6.1 Текстофобия


Для людей старорежимных, начиная от возраста лектора (ему 33) и старше, компьютер удивителен и страшен своей уникальной способностью к символической активности. Мы выросли в мире "глупых" вещей, пассивных или проявляющих свою активность чисто механически (как автомобиль, который может быстро довезти, или же раздавить, если вовремя не увернешься), и неспособных к диалогу в бытовом окружении. К диалогу способны были вещи культуры (книга, картина, симфония) --- но опосредованно, в отдельных, отведенных для этого местах, в назначенное время и при тщательном отборе собеседников.

Возможно, пирожное и говорило, по Курту Левину, на своем кондитерском языке "съешь меня" но ничего подобного продемонстрированной нам недавно упаковке, говорящей "купи меня" уже обычным человеческим голосом (причем, с учетом физиоантропометрических данных приблизившегося покупателя), не было. Вещи были "глупыми", сколь бы изощренный ум своих создателей они не воплощали, а умными были только люди.

Лектор до сих пор находится под влиянием первого своего опыта в десятилетнем возрасте общения с компьютером, что-то ему ответившим в ответ на введенную строку. Ответившим осмысленно. (Подробностей он не помнит, но, скорее всего, первым ответом было указание на то, что команда содержит синтаксическую ошибку.) Слово страшен выше --- не случайно, но, в конце концов, компьютеры были тогда надежно заперты в своих вычислительных центрах.

Роль клетки для этого зверя для очень многих сегодня играет гладкая поверхность "графических интерфейсов", скрывающая диалог. Компьютер, прикрытый таким образом, уже не демонстрирует пугающую символическую наготу. Он реагирует на нажатую кнопку с картинкой --- можно успокаивать себя, что это такая хитрая машинка: пылесос после нажатия кнопки сосет, а компьютер --- печатает, связано все чисто механически, и никакого человечка, который с изнанки интерфейса посмотрел, куда же ты нажал и определил, что же сделать с картинкой, нет.

На самом деле призрак маленьких человечков есть --- за кулисами гладкой разрисованной поверхности идет обмен такими же --- mutatis mutandis --- сообщениями, что озадачили лектора, когда он был маленьким. От нынешних маленьких их хотят попрятать, как электрический ток за изоляцией. Чтобы не стукнуло. Но в шкафу каждого компьютера, будь он трижды персональный, спрятан скелет искуственного разума, при всей условности последнего выражения.

Существует влиятельная тенденция в современных гуманитарных дисциплинах, получившая распространение в основном в англоязычном мире и связанная с остроумными теориями канадского профессора Маршала Мак-Льюэна, утверждавшего, что письменная ("визуальная") культура связана с гипертрофией аналитических функций человеческого интеллекта на определенных стадиях его развития, и что ее сменяет культура "аудиальная", направленная на синтез целого путем рассеивания внимания, и возврат к доиндивидуалистическому, общинному сознанию, от полиса и урба --- к "глобальной деревне".

С этой сменой он связывал популярность телевиденья (и утрату популярности чтения как досуга) и "клип-культуры", а его последователи указывают и на несомненный рост в девяностые популярности "графических пользовательских интерфейсов" компьютеров, причем не только в быту, но и в деловом окружении.

Мак-Льюэн, впрочем, в своем "зондировании" (как он именовал свое творчество, весьма последовательно отказываясь называть свои поздейшие произведения "текстами") был достаточно ироничен, что в гораздо меньшей степени наблюдается в творчестве его последователей.

Разумеется, каждый имеет право, хотя оно особо и не оговорено в Конституции, на персональные фобии, и даже право постфактум рационализировать их в теориях. Однако мы полагаем, что никому не должно быть позволено транслировать эти фобии другим, тем менее --- подрастающему поколению.

Компьютеры (и новая генерация "умных" приборов, машин и механизмов, включая промышленные, канцелярские и бытовые) отличаются от всего, созданного человеком ранее способностью непосредственно манипулировать символами, воспринимать символы и сообщать символы человеку, т.е., в некотором роде вести с ним диалог.

Стоит ли называть это свойство компьютеров и программ "искуственным интеллектом" --- отдельный вопрос, но сам факт, по нашему мнению, должен занять одно из основных мест в содержании учебного предмета информатики. В этом смысле, наблюдаемая тенденция к вытеснению программного инструментария, являющего это свойство в самой методически и дидактически откровенной форме, из школьных курсов кажется нам крайне неприятной и нуждающейся в коррекции.

Мы с энтузиазмом относимся к применению графических интерфейсов, как в традиционной сфере компьютерной графики, так и в новых, перспективных приложениях. Картинка часто стоит сотни слов, а энергичный жест способен выразить простую мысль быстро и однозначно.

Однако мысль о том, что пиктограммами и жестами можно заменить полноценный язык, напоминает нам лишь одну из гениальных идей академии наук в Лагадо, описанной Свифтом в "Третьем путешествии Гулливера":

"А так как слова суть только названия вещей, то автор проекта высказывает предложение, что для нас будет гораздо удобнее носить при себе вещи, необходимые для выражения наших мыслей и желаний".

Глядя на визуально-дизайнерское произведение очередного их последователя, лишь удивляешься: из какого мешка он достал значок, выражающий идею: "Вход с жующими мороженое несовершеннолетними леопардами в темное время суток запрещен"? И почему он думает, что этот значок интуитивно понятен?

"Мне часто случалось видеть двух таких мудрецов, изнемогавших под тяжестью ноши ... При встрече на улице они снимали с плеч мешки, открывали их и, достав оттуда необходимые вещи, беседовали в течение часа".

В Ладаго попытка мудрецов осуществить масштабное внедрение своего изобретения закончилась тем, что:

"Женщины, войдя в стачку с невежественной чернью ... пригрозили поднять восстание, требуя, чтобы языку их была предоставлена полная воля ... так простой народ постоянно оказывается непримиримым врагом науки!"

График нагляден, лишь пока цифры на нем можно разглядеть, а пиктограммы осмысленны только при выборе из немногих вариантов (даже сотню дорожных знаков выучить уже непросто). Для артикулированного и гибкого выражения идей (далеко не все из которых можно нарисовать) и их связи человечество выработало такой инструмент, как языки (естественные и формальные), и замены им пока не предвидится.

6.2 Командная оболочка: основные понятия


Опрационная система, как "среда обитания" файлов и процессов, состоит из ядра и оболочки с утилитами. Ядро при нормальном функционировании системы остается для пользователя "вещью в себе", которую непосредственно не видно и не слышно. В то же время, только ядро, имея доступ к оборудованию, способно оперировать файлами и процессами, т.е. осуществлять "деятельность" с некоторым объективным результатом.

Пользователю эта функциональность доступна только опосредованно, через особую программу, которая "общается" с ним посредством терминала и вполне логично называется "оболочкой". Теоретически оболочка могла бы реализовать замкнутый язык диалога (и ранние архитектуры ОС носят следы таких попыток), но в открытых системах принята другая философия --- разделения, специализации и минимизации программ. Поэтому на практике оболочка используется вместе с утилитами --- набором самых часто употребляемых программ --- и лишь синтаксис и семантика оболочки вкупе с синтаксисом и семантикой используемых утилит и образуют полноценный формальный язык диалога пользователя с системой. В июне 1993 г. этот язык был стандартизован Международной организацией стандартизации (документ ISO/IEK IS 9945-2:1993), но известен он больше под своим "отраслевым" названием POSIX.2.

Существует множество реализаций стандартного языка оболочки и утилит, восходящих к системам Unix, BSD, проекту GNU и некоторым другим проектам. Наиболее популярной на сегодня является bash в составе GNU Tools, разработанных частично в Фонде свободного программного обеспечения и частично при его поддержке. GNU Tools являются, наряду с ядром Linux, основой операционных систем на этом ядре, но доступны и для других ОС, включая альтернативные архитектуры.

В техническом аспекте оболочка представляет собой построчный интерпретатор простого языка сентенционального (директивного) программирования, в качестве операторов которого могут использоваться утилиты, как, впрочем, и любые другие программы, включая, в частности, написанные самим пользователем, и, в еще большей частности, написанные на языке самой оболочки, ибо, будучи интерпретатором, она может читать команды как интерактивно (с терминала), так и из файла.

6.3 Командная оболочка как инструмент


Пользование оболочкой очень просто: в ответ на приглашение ("подсказку"), выдаваемое находящейся в ожидании оболочкой, пользователь вводит команду и, после ее выполнения (возможно, сопровождающееся выводом на экран некоторой информации), оболочка снова выводит приглашение и ожидает следующей команды. И так --- пока пользователь не введет символ конца файла (или команду exit), после чего сеанс работы закончится. Подобным образом (с некоторыми нюансами) оболочка интерпретирует и файл "сценария" (программы) с записанными в нем командами (возможно, с использованием управляющих конструкций; общую характеристику оболочки как языка программирования см. ниже).

$ ls
! k7m-104.old tmp.sh
EPIA_Manual_v1.0.pdf k7m-104.pdf wget-log
[0-11-9].jpg words-to-avoid.ru.phpl.1 army_engl.txt
names words-to-avoid.ru.phpl.2 dengi.rar
opensource.mit.edu www.computerra.ru econ.pdf
ruspunk.swf www.ctc.msiu.ru firewalls.tar
school tmp gosorgan.amursk.ru
tmp.1 www.oreilly.com j463_k7m.pdf
tmp.phpl
$_

Рис. 1

Простейший "обмен репликами" между оболочкой и пользователем приведен на рис. 1 (здесь и далее вводимый пользователем текст выделен полужирным шрифтом, а невидимые при вводе символы --- курсивом. Введя команду ls (от LiSt --- вывести список файлов в текущем каталоге), пользователь получил список файлов, находящихся в текущем каталоге.

$ ls -l
total 3707
drwxr-xr-x 2 maksim None 4096 Oct 29 2001 !
-rw-r--r-- 1 maksim None 19743 Nov 5 00:08 EPIA_Manual_v1.0.pdf
-rw-r--r-- 1 maksim None 39 May 27 2002 [0-11-9].jpg
-rw-r--r-- 1 maksim None 666120 Nov 12 2001 army_engl.txt
-rw-r--r-- 1 maksim None 12402 Oct 11 2001 dengi.rar
-rw-r--r-- 1 maksim None 101873 Oct 8 2001 econ.pdf
-rw-r--r-- 1 maksim None 2129920 Aug 15 2001 firewalls.tar
drwxr-xr-x 2 maksim None 0 Nov 10 08:48 gosorgan.amursk.ru
-rw-r--r-- 1 maksim None 768086 May 1 2002 j463_k7m.pdf
-rw-r--r-- 1 maksim None 340016 May 1 2002 k7m-104.old
-rw-r--r-- 1 maksim None 2543572 Dec 9 2001 k7m-104.pdf
-rw-r--r-- 1 maksim None 23 Nov 28 03:44 names
drwxr-xr-x 5 maksim None 4096 Nov 7 07:08 opensource.mit.edu
-rw-r--r-- 1 maksim None 855480 Jun 7 17:01 ruspunk.swf
drwxr-xr-x 5 maksim None 0 Oct 14 2001 school
-rw-r--r-- 1 maksim None 16000 Aug 25 02:24 tmp
-rw-r--r-- 1 maksim None 467 Oct 29 2001 tmp.1
-rw-r--r-- 1 maksim None 67888 Sep 26 2001 tmp.phpl
-rwxr-xr-x 1 maksim None 198 Aug 23 04:48 tmp.sh
-rw-r--r-- 1 maksim None 835 Nov 27 2001 wget-log
-rw-r--r-- 1 maksim None 12698 Jun 16 2000 words-to-avoid.ru.phpl.1
-rw-r--r-- 1 maksim None 12698 Jun 16 2000 words-to-avoid.ru.phpl.2
drwxr-xr-x 6 maksim None 4096 Sep 26 2001 www.computerra.ru
drwxr-xr-x 3 maksim None 0 Oct 9 2001 www.ctc.msiu.ru
drwxr-xr-x 12 maksim None 4096 Apr 26 2002 www.oreilly.com
$_

Рис. 2


Начинающих пользователей (особенно воспитанных в субкультуре ПК) часто удивляет такая вещь: если дать, например, команду ls, результат будет весьма лаконичным, в то время, как у нее есть ключи-модификаторы, позволяющие получить указанный список в виде, гораздо более подходящем для восприятия человеком (см. рис. 2). Почему же умолчанием (вариантом, применяемым в случае, если ключи явно указаны не были) является именно лаконичная, "некрасивая", "неудобная" форма?

Причина очень проста: как и любая другая стандартная утилита, ls гораздо чаще используется не оператором, а какой-нибудь другой программой, поэтому ее вывод приспособлен для наиболее удобной его последующей обработки. Подача команды с клавиатуры --- исключение, а не правило, и для удобства оператора предусмотрен соответствующий ключ. Если пользователю часто нужно выводить список файлов на экран, он запрограммирует оболочку, определив для себя синоним (например, синонимом конструкции ls -al --color=always | less, постранично выводящей список файлов со всеми атрибутами и с выделением типов файлов цветами, может быть определена команда lls).

Понять эту простую вещь означает понять весьма серьезную часть компьютерной культуры. Универсальные системы (например, ОС), в отличие от специализированных (например, мультимедийных киосков или игровых приставок) создаются не для удобства пользования ими "из коробки" абстрактным "простым пользователем", а для удобства их настройки (программирования) конкретным пользователем под его конкретные нужды. Это не удобство, а метаудобство, не встроенная в стены комнаты мебель, а модульный гарнитур с инструкцией по сборке, не "для всех", а для каждого. А "простых" пользователей не бывает, все мы сложные и разные.

$ cat
Петя
Петя
Яна
Яна
Вася
Вася
Маша
Маша
D
$_

Рис. 3

Утилиты могут не только выводить текст, но и читать ввод. Простейший пример --- утилита конкатенации cat, которая, будучи издана без аргументов, просто построчно копирует текст (см. рис. 3). Утилита, читающая что-либо из стандартного ввода и выводящая что-либо на стандартный вывод, называется фильтром, фильтрами являются многие из стандартных POSIX-утилит.

$ cat >names
Петя
Яна
Вася
Маша
D
$ ls names
names
$ cat
Петя
Яна
Вася
Маша
$_

Рис. 4

Стандартный ввод-вывод --- это два файла, которые по умолчанию связаны с текущим терминалом. Мощнейшим средством оболочки является перенаправление ввода и вывода в произвольный файл, задающееся соответственно знаками < и >, за которыми следуют имена файлов. На рис. 4. показано перенаправление вывода команды cat в файл names и перенаправление ввода этой команды из созданного предыдущей командой файла. Важно заметить, что перенаправление стандартного ввода-вывода производится именно оболочкой, "умения" распознавать перенаправление как свои аргументы от самой утилиты (или, к примеру, пользовательской программы) не требуется.

Еще одним мощным средством оболочки является так называемый "конвейер" (или "канал") --- соединение вывода одной команды с вводом другой.

$ cat names names >names2
$ cat
Вася
Маша
Петя
Яна
Вася
Маша
Петя
Яна
$ sort
Вася
Вася
Маша
Маша
Петя
Петя
Яна
Яна
$ uniq
Вася
Маша
Петя
Яна
Вася
Маша
Петя
Яна
$ sort
Вася
Маша
Петя
Яна

Рис. 5

На рис. 5 приведен развернутый пример. Командой cat names names >names2 мы создаем файл names2, содержащий удвоенное содержимое ранее созданного файла names. Утилитой sort его можно отсортировать в алфавитном порядке, а про утилиту uniq известно, что она удаляет повторяющиеся строки. Однако удаляет она только подряд идущие строки, поэтому, чтобы уникализировать строки в файле, содержащем их в произвольном порядке, файл нужно сперва отсортировать.

Нам уже известно, что перенаправлением ввода-вывода можно создать временный файл (это выглядело бы так: sort temp ; uniq temp ; rm temp), однако конвейер, задаваемый символом |, позволяет "замкнуть" вывод команды sort на ввод uniq без создания промежуточного файла, который потом нужно удалять: sort
И, наконец, еще одним мощным средством командной оболочки является поддержка шаблонов имен файлов (усеченного варианта так называемых "регулярных выражений"). Если мы хотим удалить из каталога, содержимое которого отображалось в примере на рис. 1, файлы words-to-avoid.ru.phpl.1 и words-to-avoid.ru.phpl.2, нам не обязательно передавать их список команде rm; достаточно определить выражение, однозначно их характеризующее, например words-to-avoid*. Метасимвол * означает любое количество любых символов; существют и другие метасимволы. Результат выполнения этой команды в указанном каталоге в точности эквивалентен команде rm words-to-avoid.ru.phpl.1 words-to-avoid.ru.phpl.2, причем "раскрытие" метасимволов выполняет, опять же, не утилита, а сама оболочка.

6.4 Командная оболочка как язык программирования


В качестве языка программирования стандартная оболочка может быть охарактеризована следующим образом:
  • сентенциональная (директивная) парадигма;
  • возможность построчной интерпретации или однопроходной компиляции (т.е. построчкая контекстная независимость сверху вниз). Нам неизвестны компилирующие реализации языка стандартной оболочки;
  • наличие управляющих конструкций:
  • последовательного исполнения,
  • условного (if-then, if-else, if-then-else, if-then-elif...) исполнения,
  • многовариантного выбора (case),
  • циклов (перебора списка for, с постусловием until, с предусловием while) и их разрыва (break, continue);
  • наличие механизма подпрограмм-функций (описываемых как в файле сценария, так и в отдельных файлах или библиотеках);
  • наличие оператора присваивания (установки значения переменной);
  • возможность использования внешних программ (команд) ОС в качестве операторов (вызовов функций) и обработки значений их кодов возврата;
  • наличие нетипизованных переменных. Переменные декларируются первым упоминанием, могут принимать в качестве значения произвольную строку. Значение, могущее быть интерпретированным как число может использоваться в выражениях целочисленной арифметики;
  • развитый синтаксис выражений, используемых в операторах присваивания, а также в качестве условий исполнения или циклов;
  • развитая система работы с файлами (ввода/вывода), в том числе со стандартным вводом с терминала и выводом на терминал;

Таким образом, язык оболочки хорошо подходит для того, для чего он предназначен: написания программ (сценариев) работы с файлами (небезынтересно, что значительная часть самих открытых ОС написана именно на языке оболочки). Он не слишком подходит для решения алгебраических задач, хотя отсутствие встроенного механизма работы с плавающей арифметикой может быть обойдено применением специальных утилит, например, универсального калькулятора произвольной точности bc, и хранением значений вещественных чисел в строковых переменных. Подобным же образом использованием внешних утилит можно писать на этом языке программы с оконным (как псевдографическим, так и графическим) интерфейсом.

Синтаксис языка (в частности, синтаксис выражений) не отличается внешним изяществом (хотя для знатока сценарии могут быть весьма красивыми и нетривиальными) и вряд ли может быть рекомендован в качестве первого языка при знакомстве с программированием. Отсутствие типизации и неподдержка иных, кроме сентенциональной, парадигм программирования, во всяком случае, служат веским поводом к тому, чтобы не вводить его в учебный курс в качестве единственного.

(Поскольку использование тех или иных языков программирования в учебном процессе само по себе является предметом постоянных споров, на всякий случай стоит, не погружаясь в глубину аргументации, все же заметить, что лектор придерживается весьма консервативных взглядов, и считает, что в качестве первого языка лучше всего подходят Алгол-60, Паскаль, АПЛ или любой другой простой язык сентенционального программирования, либо простой объектный язык наподобие Лого. Использование языков, поощряющих плохой стиль (как Бейсик) или лояльно к нему относящихся (как С), во всяком случае, не кажется ему удачным выбором. Крайне важным ему кажется хотя бы поверхностное знакомство как минимум с двумя с разными (разработанными в ориентации на разные парадигмы) языками).

В то же время, хотя бы беглое знакомство с языком оболочки, помимо очевидного прагматического значения, дидактически полезно. Он вполне пригоден для демонстрации таких важных понятий, как присвоение значений, смысл и использование управляющих конструкций, подпрограммы (функции). Технически он прост в использовании благодаря наличию интерпретатора bash (могущего работать в POSIX-режиме, т.е. в строгом соответствии со стандартами) под рукой в любой стандартной ОС (а также наличию портов того же bas практически для любой альтернативной платформы). Он может быть единственным сентенциональным языком в общеобразовательном курсе информатики.

Ресурсы


Методическая литература, специально ориентированная на школьный курс и посвященная программированию на языке оболочки, на русском языке сегодня отсутствует, хотя следует отметить, что "классические" руководства по Unix за тридцать лет развития отрасли достигли практически кристальной прозрачности изложения и легко могут быть адаптированы для нужд как учителей, так и самих учащихся. По-русски нам известна единственная книга [11], специально посвященная программированию на языке оболочки.

Интерпретаторы языка оболочки являются неотъемлемой частью открытых систем и включены в состав любого дистрибутива (так же, как и руководства пользователя); лучшим из них мы считаем свободный bash, разработанный Фондом свободного программного обеспечения. Для пользователей альтернативных архитектур (например, Microsoft Windows) мы рекомендуем также bash, доступный в составе многочисленных программных пакетов.

Для Microsoft Windows рекомендуется установка пакета Cygwin, содержащего утилиты GNU и некоторые другие программы, позволяющие организовать стандартную рабочую среду. Следует учесть, что при работе в версиях MS Windows, основанных на MS-DOS (MS Windows 95/98/Me), у многих программ возникают сложности из-за отсутствия в MS-DOS контроля за правами доступа к файлам и каталогам (версии, основанные на NT --- MS Windows NT/00/XP, лишены этого недостатка), а также то, что локализованная для русской среды сборка Cygwin в настоящее время не поставляется. Для поддержки кириллических символов необходимо в каталоге пользователя создать файл с именем .inputrc, содержащий строки:

set meta-flag on
set convert-meta off
set output-meta on

Альтернативой Cygwin (по ряду причин менее предпочтительной) является использование системы Interix UNIX Tools for Windows, также содержащей утилиты GNU, включая bash (ее можно приобрести через Microsoft на диске либо скачать с их сайта).