Для того чтобы писать приложения под Unix не обязательно его устанавливать (под словом Unix я буду продразумевать все *nix системы). Это утверждение звучит довольно-таки парадоксально, но это действительно так, и в данной статье я попытаюсь вас в этом убедить.
Если вы не являeтесь истинным Unix-гуру, то для того чтобы написать пару приложений под эту ОС или скомпилировать существующие программы вам вовсе не нужно устанавливать Unix . Для данных целей отлично подойдет эмулятор Unix . Существует много замечательных программ, превосходно справляющихся с этой задачей, например: UWin , MinGW , Cygwin и др.
Для компиляции простых программ подойдет и MinGW , но для более сложных он не пригоден. Uwin является более продвинутым эмулятором, но его функциональность значительно уступает другому более популярному эмулятору Cygwin .
Cygwin - это очень функциональный, бесплатный эмулятор Unix . Он распространяется в виде одного-единственного файла (setup.exe ), пусть вас не вводит в заблуждение размер этого файла (~300 kb ), это не сам Cygwin , а только его инсталлятор. Все необходимые утилиты и библиотеки придется скачивать отдельно в процессе установки, или указать в качестве источника локальный каталог, если необходимые файлы у вас уже есть.
Cygwin
включает в себя огромное количество разнообразных утилит и библиотек, многие из которых вам наверняка никогда и не понадобятся, но при установке Cygwin
позволяет выбрать только нужные вам компоненты. Таким образом, если вы хотите только скомпилировать программу, то вам будет достаточно установить компилятор GCC
, набор необходимых библиотек и утилиту make
. Лично я установил все приложения, так как Cygwin
позволяет легко "избавиться" от них в любое время. На самом деле Cygwin
состоит всего из одного файла cygwin1.dll
, все остальное является программными пакетами GNU
, специально перекомпилированными для работы с Cygwin
.
Приглашение Bash , практически не отличается от cmd.exe (~ - означает ваш домашний каталог). Здесь не существует логических дисков (A, C, D и тд.), отсчет ведется от корневого каталога обозначаемого "/ ". Также необходимо помнить, что регистр здесь имеет значение, так что Etc и etc - два совершенно разных каталога. Давайте попробуем перейти в корневой каталог, для этого достаточно выполнить знакомую вам команду "cd / " (~ должна смениться на / ). После этого наберите команду "dir ", или "ls ", для того чтобы просмотреть содержимое корневого каталога. Думаю, что сейчас вам стало понятно, что такое корневой каталог.
Описать все команды в данной статье я не могу, поэтому перейдем сразу к самому важному этапу, собственно для которого мы и установили Cygwin
. Попытаемся скомпилировать какую-нибуддь программу. Для компиляции я выбрал программу Htop
(http://freshmeat.net/projects/htop/), это усовершенствованная версия стандартной программы top
, которая является консольным менеджером процессов. Первым делом необходимо распаковать архив. Это вы можете сделать как в Windows
, так и непосредственно в Cygwin
. В Cygwin
это делается командой:
tar zxf htop-0.6.tar.gz
Разумеется, что в данный момент вы должны находиться в том же каталоге, где находится архив htop-0.6.tar.gz . После распаковки заходим в созданный каталог htop-0.6 и выполняем три стандартных команды для компиляции приложения.
./configure
make
make install
Вот и все, компиляция закончена. Смело набираем команду htop
и любуемся результатом. Получисшийся "EXE"шник" находиться в каталоге /usr/local/bin/
.
Теперь давайте попробуем сами написать простенькую программу (Hello world
) и скомпилировать ее с помощью GCC
. Для начала нам нужно написать саму программу, сделаем это с помощью программы cat
. Введите команду cat new.c
, где new.c
имя файла, содержащего исходный код. После выполнения команды напишите следующий код:
#include
int main(){
printf("Hello World");
return 1;}
После того, как код введен нажмите Ctrl+C . Теперь скомпилируем его с помощью GCC . Делается это командой:
Gcc new.c -o new.exe
В той же директории, где находился new.c появится еще один файл - new.exe . Запустив его, вы увидите ожидаемую надпись "Hello World ".
На этом можно было бы завершить статью, но я решил еще рассказать о графической среде Cygwin
, чтобы потом не возвращаться к этой теме. Я думаю, вы обратили внимание на то, что при установке пакетов Cygwin
предлагает установить оболочки Gnome
и KDE
. На самом деле это не просто оболочки, а их библиотеки, которые необходимы для запуска приложений. Так, например, графическая версия знаменитого редактора emacs
, будет запускаться прямо под Windows
, как будто это win32-приложение
. Чтобы не быть голословными давайте попробуем этот самый Emacs
запустить. Делается это командой:
xemacs
Вот что мы увидим.
Как видите, все прекрасно запускается и работает. Но так бывает не у всех. Графическая среда очень капризна. Поэтому нужно уметь ее конфигурировать. Документации по настройке X-сервера
в интернете очень много и вы без труда сможете ее найти.
В конце хотелось бы напомнить, что как бы ни был хорош Cygwin , он всего лишь эмулятор. А как известно копия не может быть лучше оригинала, поэтому если вы хотите стать настоящим Unix-гуру, не поленитесь поставить полноценный unix-дистрибутив. На мой взгляд начинать лучше с Linux . Из всевозможных дистрибутивов рекомендую вам Slackware .
Вам когда-нибудь приходилось после linux’а пользоваться командной строкой Windows? Мне, да. Очень не привычно. Многие команды называются по-другому. Например, аналог ls в Windows это dir. Стилистика передачи аргументов у местного интерпретатора другая. А многих возможностей, которые дают линуксовые утилиты тут просто нет. Как-же получить аналогичную linux среду в windows? Это можно сделать установив Cygwin.
Знакомство с развернутой системой
Во-первых у cygwin по-умолчанию устанавливается свой эмулятор терминала, с которым работать по-удобнее, чем с командной строкой Windows.
Тут у нас первые проблемы. Как видите, windows утилиты, в том числе и cmd.exe печатают текст в oem-866, а эмулятор cygwin читает текст в utf-8. Если переключить кодировку на 866 кодовую страницу, то последствия этого действия еще хуже.
cygwin интерпретировал русскоязычное имя в unicode кодировке, как строку в 866 кодировке и в итоге решил создать новую директорию /home/╨Ф╨╝╨╕╤В╤А╨╕╨╣. Так что лучше все оставить как было и, при возможности обходиться cygwin утилитами. В случае, если вам нужно запустить командную оболочку без эмулятора терминала, запустите пакетный файл Cygwin.bat.
В данном случае, cygwin установлена в папке C:\cygwin64\. Узнать преобразуются пути из unix-path в windows пути нам поможет утилита cygpath.
$ cygpath -w `pwd`
C:\cygwin64\home\Дмитрий
$ cygpath -w /
C:\cygwin64
$ cygpath "C:\cygwin64"
/
$ cygpath "C:\cygwin64\home\Дмитрий"
/home/Дмитрий
А как получить доступ к диску C:, если все пути транслируются в C:\cygwin64\.
Все просто. В дирректории /cygdrive есть точки монтирования, которые по имени соответствуют томам windows.
$ cygpath "C:\"
/cygdrive/c
$ cygpath -w /cygdrive/c/somedir
C:\somedir
Cygpath так-же успешно транслирует обращения к этой точке монтирования в Windows пути.
Кстати, существование такой утилиты как cygpath показывает, почему с cygwin вы, при возможности, должны пользоваться только ее утилитами. Если, вам нужно запустить java VM, а она понимает только Windows пути, вам придется cygwin путь преобразовать при запуске:
$ java -jar `cygpath -w "/opt/some.jar"`
Из этого следует, что многие скрипты из linux’а нельзя просто взять и запустить в windows. Нужно иногда постараться перенести скрипт. Более того, не все утилиты командной строки будут работать.
Больше возможностей
SSH
Вы можете поставить клиент и сервер OpenSSH — это позволит вам получить удаленный доступ к командной оболочке bash, с другого компьютера или, даже с телефона, например, с помощью JuiceSSH . Так-же вы получите удаленный доступ к своим файлам по протоколу SFTP(хотя на винде проще расшарить каталог, доступный по SMB).
Программирование
В комплект входят известные компиляторы, такие как Clang или GCC, интерпретаторы языков Python, Perl, PHP, Ruby и др. Вы можете собрать POSIX-совместимые программы под винду.
Текстовые редакторы
Интерактивные редакторы — vim, nano, emacs.
Не интерактивные редакторы, подходящие для использования в скриптах — sed, awk.
Итог
Если вы скучаете по возможностям linux в винде, возможно, стоит поставить эту штуку себе.
Разработка кроссплатформенных приложений — дело непростое. В особенности оно непростое благодаря Windows, в котором все не как у людей. Тут тебе ни нормального терминала, ни нормальных консольных утилит, вообще ничего нет! В очередной раз столкнувшись с этой проблемой, я решил снова попробовать Cygwin. И знаете, оказывается, он действительно делает из Windows нечто, чем почти можно пользоваться!
Скачать инсталлятор Cygwin можно отсюда . На самом деле, это не столько инсталлятор, сколько пакетный менеджер, который при запуске прямо таки спрашивает, какие пакеты вы хотели бы поставить. Ребята! Пакетный менеджер! Под винду! Инсталлятор создает кэш в каталоге, из которого он будет запущен. Поэтому перед запуском лучше создать какую-нибудь специальную папочку на рабочем столе и положить инсталлятор в нее.
Какие пакеты на мой взгляд необходимо поставить:
- openssh — мастхев;
- inetutils , bind-utils , ping , nc и nc6 — мастхев;
- wget , curl — мастхев;
- python и/или python3 — считаю, что мастхев;
- vim , gvim — для правки небольших файлов лишним не будет;
- diffutils , pwgen , unzip , rzync — пусть будут на всякий случай;
- gcc и/или clang , cmake , gdb — если нужно;
- screen , tmux , mc — для любителей;
- git — под очень большим вопросом, см ниже;
Обратите внимание! Чтобы в Cygwin установить pip, поставьте галочку напротив пакета python-setuptools и/или python3-setuptools . После установки в терминале скажите:
easy_install-2.7 pip
easy_install-3.4 pip
…, смотря какую версию или версии Python вы поставили.
Итак, после установки Cygwin можно открыть терминал:
Ребята! Нормальный терминал, который ресайзится, позволяет копировать и вставлять текст, и вот это все! Под винду! Со всем хорошо знакомыми и привычными командами id, ls, pwd, cat, ssh, scp, и другими. С человеческим окружением — .bashrc, ~/.ssh/config, и так далее. Плюс к этому, в отличие от позорной поделки под названием PowerShell, Cygwin не тащит за собой.NET Framework. Мы даже можем открыть несколько терминалов и переключаться между ними при помощи сочетания Ctr + Tab. Это почти как табы! Понятное дело, старый-добрый Alt + Tab тоже работает.
Выше я не советовал устанавливать Git , и вот почему. Дело в том, что в Cygwin он заметно тормозит. рекомендуют выполнить команды:
git config
--global
core.preloadindex true
git config
--global
core.fscache true
git config
--global
gc.auto 256
Но это, к сожалению, не решает проблему полностью. Так на большом проекте команда git status может выполняться секунд 20. В Linux на точно таком же репозитории команда отрабатывает мгновенно.
Скрипт cygwin.bat выполняется из командной строки DOS, устанавливает среду Cygwin и запускает интерпретатор bash под Windows. Cygwin прекрасно настраивает переменные Unix-окружения в соответствии с переменными окружения Windows. Например, на своей машине, я вошел в Windows, как пользователь bjohnson. Когда я запускаю Cygwin , он по умолчанию загружается под управлением пользователя bjohnson.
Ниже представлено окно с некоторыми стандартными Unix-командами в Cygwin .
В зависимости от установленных вами пакетов, вы легко можете запускать соответствующие Unix-утилиты. Если вы пользователь Unix, вам, несомненно, хотелось бы, чтобы в Windows была команда ps для просмотра выполняемых в настоящее время процессов без использования Task Manager . Если вы используете флаг -aW , вы сможете увидеть процессы Windows, как и любые запущенные процессы Cygwin . Ниже представлен список Windows-процессов, доступный в результате выполнения Cygwin команды (ps -aW | less ).
PID PPID PGID WINPID TTY UID STIME COMMAND 3193213 0 0 4291774083 ? 0 Dec 31 C:\WINDOWS\SYSTEM\KERNEL32.DLL 63753 0 0 4294903543 ? 0 Dec 31 C:\WINDOWS\SYSTEM\MSGSRV32.EXE 60569 0 0 4294906727 ? 0 Dec 31 C:\WINDOWS\SYSTEM\MPREXE.EXE 77349 0 0 4294889947 ? 0 Dec 31 C:\WINDOWS\SYSTEM\RPCSS.EXE 196093 0 0 4294771203 ? 0 Dec 31 C:\WINDOWS\SYSTEM\mmtask.tsk 191237 0 0 4294776059 ? 0 Dec 31 C:\WINDOWS\EXPLORER.EXE 237709 0 0 4294729587 ? 0 Dec 31 C:\WINDOWS\TASKMON.EXE 230713 0 0 4294736583 ? 0 Dec 31 C:\WINDOWS\SYSTEM\SYSTRAY.EXE 217533 0 0 4294749763 ? 0 Dec 31 C:\PROGRAMFILES\DIRECTCD\DIRECTCD.EXE 5.1.
Структура директорий и полномочия доступа к файлам
Cygwin монтирует ваши локальные диски в директории /cygdrive . Сюда входят разделы жесткого диска, дисководы, устройства для чтения компакт-дисков, устройства для чтения ZIP . Выполним команду df на моей машине. Получим структуру, подобную той, что приведена ниже.
Bjohnson@BRADMAN $ df Filesystem 1k-blocks Used Available Use% Mounted on C:\cygwin\bin 2096832 0 2096832 0% /usr/bin C:\cygwin\lib 2096832 0 2096832 0% /usr/lib C:\cygwin 2096832 0 2096832 0% / c: 2096832 0 2096832 0% /cygdrive/c d: 670496 670496 0 100% /cygdrive/d
После установки Cygwin я указал инсталлятору сохранить файлы в директорию C:\cygwin\ . Cygwin использовал эту директории в качестве корневой точки монтирования файловой системы . Он смонтировал C:\cygwin\ bin на /usr/bin и C:\cygwin\lib на /usr/lib . В директории /usr/bin , /bin , и /usr/local/bin были добавлены переменные окружения Cygwin (но не Windows). Директории из среды окружения Windows были импортированы в среду Cygwin , чтобы иметь к ним доступ.
Cygwin также использует разумную систему полномочий доступа для Unix-файлов. Но что это может означать для всех ваших Windows-файлов? Кто владелец файлов , и какие полномочия установлены по умолчанию? Запустим команду ls -al на несколько Windows-файлов, чтобы получить ответ.
bjohnson@BRADMAN /cygdrive/c/cyginstall $ ls -al total 273 drwxr-xr-x 1 bjohnson unknown 0 Mar 13 17:48 . drwxr-xr-x 1 bjohnson unknown 0 Dec 31 1969 .. drwxr-xr-x 1 bjohnson unknown 0 Mar 13 18:06 contrib drwxr-xr-x 1 bjohnson unknown 0 Mar 13 18:03 latest -rwxr-xr-x 1 bjohnson unknown 218112 Mar 13 17:48 setup.exe -rw-r--r-- 1 bjohnson unknown 60607 Mar 13 17:54 setup.ini
Cygwin попытается получить информацию о владельцах файла (пользователе и группе) из Windows. Пока я использовал машину под управлением Windows 98 с одним пользователем, все файлы принадлежали мне (bjohnson) с указанием в качестве группы "unknown". Это устанавливало полномочия для всех Windows-директорий и исполняемых файлов на значение 755 (чтение и выполнение для всех, запись только для владельца) и устанавливала всем файлам Windows полномочия 644 (чтение для всех, запись только для владельца). Выполнение команды chmod для Windows-файлов игнорируется.
Любители работать в консоли, подобной консоли линукса, могут установить себе Cygwin, юникс подобную среду, где будут доступны стандартные консольные программы из линукса.
Ставится Cygwin довольно просто. В процессе установки в одном из режимов можно выставить флажки напротив программных пакетов, которые вы хотите установить. Я выбрал себе пакеты nano, git и что-то ещё.
После инсталляции на рабочем столе появляется ярлычок Cygwin для запуска среды.
Запуск Cygwin из любой папки
Так как я пользуюсь TotalCommander-ом, мне удобно запускать программы сразу из нужной мне директории. Создадим удобный bat-файл для запуска Cygwin.
Сразу, без долгих размышлений, копируем строку "Объект" из свойства этого ярлыка в новый созданный нами файл C:\bin\bash.bat
Полное содержимое файла будет выглядеть так:
@start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico -
Обратите внимание на то, что путь до exe-файла у вас может быть другим. У себя я установил Cygwin в директорию C:\cygwin
.
Также если директория C:\bin
у вас ещё не добавлена в переменную окружения PATH
, то это следует сделать.
Настройка запуска Cygwin
После некоторой работы с Cygwin я обнаружил, что не смотря на то, что запускать Cygwin я могу из любой директории, просто прописав слово bash , сама же запускаемая среда всегда открывается в домашней директории вашего пользователя. (Домашняя директория установлена в переменной окружения HOME ).
Это выглядит не очень удобно, ведь если я пишу команду bash , находясь в директории D:\xyz , то я и рассчитываю, что запущенный Cygwin также будет находиться в директории D:\xyz .
Если вы обратите внимание, то увидите, что ярлык с рабочего стола запускает утилиту mintty.exe
. Мы сразу понимаем, что необходимо ознакомиться с перечнем входящих атрибутов для данной команды.
Открываем Cygwin и вводим
Man mintty
После внимательного изучения мануала, мы радуемся некоторым возможностям, о которых не подозревали, а именно: возможности задать размеры и координаты запускаемого окна Cygwin.
Открываем наш bat-файл и изменяем его содержимое на следующее:
@start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico --size 120,77 --position -4,0 -
В данном случае я установил нужный мне размер окна Cygwin и позицию появления окна (отрицательное значение -4 нужно, чтобы кромка окна оказалась за границей монитора, и её не было видно).
Теперь моё окно будет всегда появляться в удобных мне координатах, а не будет смещаться при каждом новом запуске на +8 пикселей по x,y.
Но как же быть с директорией запуска Cygwin?
Ведь переходить в нужную директорию из домашней - жутко не удобно!
Решение было найдено! Для установки текущей директории при запуске Cygwin мы можем использовать скрипт автозапуска для запускаемой среды bash .
Значит нам нужно усовершенствовать наш bash.bat файл таким образом, чтобы он создавал файл автозапуска для запускаемой консоли bash
Запускаем Cygwin, вводим команду "man bash
" и читаем документацию в поисках необходимого нам.
Находим несколько вариантов имён файлов для домашней директории пользователя, который запускаются при авторизации в bash.
Файлы, запускаемые при авторизации в bash
:
~/.bash_profile ~/.bash_login ~/.profile
Файл, запускаемый при запуске "bash без авторизации в нём
~/.bashrc
Важное замечание : файл автозапуска ~/.bash_login (или любой другой) должен быть написан в кодировке UTF-8! И не должен использовать символы \r . (Например команда pwd у меня не выполнялась, когда файл содержал в конце символ \r , свойственный системе Windows).
Как оказалось, вывести UTF-8 текст из CMD не так-то просто, но возможно!
Вот пример, как это делается:
Cmd /u /c chcp 65001 | echo некий текст >"имя_файла"
Усовершенствуем наш C:\bin\bash.bat файл, теперь он имеет содержимое:
@echo off SET file=.bash_login cmd /u /c chcp 65001 | echo #!/bin/bash > "%HOME%\%file%" cmd /u /c chcp 65001 | echo cd "%CD:\=/%" >> "%HOME%\%file%" @start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico --size 120,77 --position -4,0 -
После запуска, консоль bash выполняет содержимое файла ~/.bash_login . Этот файл должен быть в формате UTF-8. Для этого мы вызываем CMD cо флагом /u , который сообщает, что запускаемая консоль должна возвращать результат в формате UTF-8.
Как можно увидеть, мы передаём две команды, разделённых знаком | . Данный знако позволяет записать две нужных нам команды в одну строку.
Первая команда chcp 65001 устанавливает кодировку UTF-8 в запущенной консоли. (Чтобы узнать, какая текущая кодировка установлена в консоли, достаточно вызвать команду chcp без параметров.)
Вторая команда echo текст > "%HOME%\%file%" печатает соответствующий текст в файл с именем "%HOME%\%file% ", где имена переменных развёртываются в путь к домашней директории и имени файла .bash_login .
Обратите внимание на необычное обращение к переменной CD , в которой содержится текущий каталог cmd-консоли. Если обычно переменная развёртывается записью
То в нашем случае, мы используем запись
%CD:\=/%
Что позволяет сразу заменить все слеши в стиле Windows \ на слеши в стиле Linux / .
Не забываем помещать все имена файлов и директорий в двойные кавычки, таким образом это позволит попадать в директории содержащие пробелы.
За счёт того, что используется UTF-8, данная конструкция успешно позволяет открывать Cygwin в директориях с русскими именами.
Таким образом, при каждом запуске в консоли команды bash , будет запускаться скрипт C:\bin\bash.bat , который перезаписывает файл автозагрузки среды bash в Cygwin. Теперь мы можем легко и удобно запускать консоль bash из любой директории и сразу попадать в эту же самую директорию в bash-консоли.
Радуемся и наслаждаемся результатом!
Подведём итоги
- Мы установили Cygwin
- Создали файл C:\bin\bash.bat
с содержимым
@echo off
SET file=.bash_login
cmd /u /c chcp 65001 | echo #!/bin/bash > "%HOME%\%file%"
cmd /u /c chcp 65001 | echo cd "%CD:\=/%" >> "%HOME%\%file%"
@start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico --size 120,77 --position -4,0 -
(Заметка: путь C:\bin\
должен содержаться в переменной окружения PATH
)
За счёт этого мы добились:- запуска терминала Cygwin в указанной позиции экрана (параметр --position )
- запуска окна определённого размера (параметр --size )
- запуска Cygwin из любой директории, набрав в консоли слово bash
- при этом запущенный Cygwin располагается в той же директории, откуда был запущен!