Введение. --------- Операционная система Linux происходит от операционной системы Unix. Она изучается в той степени, в которой она демонстрирует свойства Unix. В равной степени можно было бы изучать FreeBSD, MacOSX или QNX, с той разницей, что названные системы сильнее отличаются от прототипа (Unix), кроме того, в случае с MacOSX аппаратное обеспечение (железо) менее доступно обучаемому, чем для Linux (свободная лицензия GNU). Как и в случае Unix, унивесальными являются (в порядке возрастания сложности) - знания необходимого минимума команд командной строки. - минимальное владение текстовым редактором (vi, ed, emacs). - умение собирать макрокоманды (bash scripting) - умение использовать аппарат компиляции исходных текстов программ: configure, make, make install. - lex и yacc. Владение GUI (Graphic User Interface) приводит к знанию только одного типа ОС или даже версии GUI (Gnome, KDE, XFCE etc.); и полной беспомощности при нахождении в родственной ОС (скажем FreeBSD). При изучении ОС наибольшую помощь оказывают т.н. дадзибао - основопологающие принципы построения ОС. Их немного Например: I. ВСЁ ЕСТЬ ФАЙЛЫ II. SYSCALL = OPEN + CLOSE + READ + WRITE FORK + EXEC III. В команде с двумя аргументами первый это то, что существует второй - то, что создается В книге использованы примеры. проверенные на Fedora 12 Constantine, используемой в качестве guest в среде VirtualBox 3.16, Windows 7. Файловая система. ----------------- Как и в Windows файловая система представляет из себя древовидную структуру где папка (каталог, directory) это всего лишь разновидность файла, папка может содержать другие папки или файлы. Основное отличие от Windows в том, что нет дисков C, D и т. д. в основе всей файловой системы лежит единственная папка / (root), которая содержит все остальные папки и файлы. Поскольку ВСЁ ЕСТЬ ФАЙЛЫ то среди этих папок есть и папка сырых (raw) устройств /dev. Например первый жесткий диск (primary master) это, чаще всего (зависит от типа устройства SCSI, SATA-IDE или PATA-IDE и версии ядра Linux, в нашем случае SATA, 2.6) /dev/sda. Он может быть разбит на разделы, партиции: sda1, sda2, sda3,.. Папки proc, sys и вовсе не расположены на жестком диске а в оперативной памяти компьютера (RAM) и содержат текущую временную информацию о работе компьютера/операционной системы. Такие папки монтируют в основную систему: mount ... proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) ... При успешном монтировании мы видим логическую структуру смонтированного объекта - папки и файлы в той папке куда мы его смонтировали: mount proc /proc -t proc -o rw mount sysfs /sys -t sysfs -o rw Вспоминаем дадзибао III. Дополнительные ключи -t (type) -o (options) сообщают команде mount дополнительные подробности монтирования. Ha разделе диска смонтированным как / (root), чаще всего уже созданы папки: /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin которые содержат полезные программы для настройки и управления системой (утилиты). В папке /etc расположены файлы начальной настройки этих утилит (конфигурационные файлы, которые можно изменять обычным текстовым редактором). Папки /lib /usr/lib и /usr/local/lib содержат общие части утилит - библиотеки - (libraries). Папки /home/user и /root это домашние папки сответствующих пользователей - в них вы начнете сеанс с UNIX, также они предназначены для создания всевозможных пользовательских файлов. Признаком хорошего тона считается монтирование в папки /media и /mnt, вручную монтируют только в папку /mnt. Папка /tmp служит для хранения временной информации, /var - быстро изменяющейся, /opt - опциональной. Папка /lost+found предназначена для утраченной но частично восстановленной информации в основном в файловых системах с низкой надежностью: ext, ext2 О папках include и src мы поговорим когда речь пойдет о текстовых и двоичных файлах, построении программ из исходных текстов, и процессе компиляции. Основные команды командой строки. --------------------------------- Работа в командной строке напоминает чат с приятелем - в окне, иногда единственном (при отсутствии графики и виртуальных терминалов) ведется диалог с компьютером, где вы - (если компьютер не подключен к сети) единственный активный пользователь - подаете команды строго определенного формата, на которые компьютер (а точнее операционная система) отвечает в случае необходимости. Формат команды следующий: command -key0 value ... -keyN value arg0 ... argM pwd 001. --------- Поскольку, находясь перед пустым окном, нет другой возможности узнать в каком месте файловой системы мы находимся спросим об этом ОС pwd # print work directory. 001 За символом # находится однострочный комментарий, раскрывающий нам, сокращением каких слов является команда pwd и порядковый номер изучаемой команды - 001. ОС заканчивает свой ответ знаками $ или #, первый означает, что вы - обычный пользователь, # - root - пользователь с абсолютными правами - учтите, что постоянно работать рутом опасно для системы, из-за возможных ошибок с вашей стороны. Пример 1. [virtu@darkstar ~]$ pwd /home/virtu [virtu@darkstar ~]$ Я обычный $ пользователь virtu на компьютере darkstar в папке /home/virtu man 002. --------- Пришло время поговорить о команде помощи. Это не help а man - manual. Информация подсказки разбита на 7 глав и если подсказка на требуемое слово содержится одновремено в нескольких главах и она отличается друг от друга - то следует воспользоваться полным вариантом команды: man 3 intro # введение в третью главу информации подсказки Пример 2. [virtu@darkstar ~]$ man intro INTRO(1) Linux User’s Manual INTRO(1) NAME intro - Introduction to user commands DESCRIPTION Section 1 of the manual describes user commands and tools, for example, file manipulation tools, shells, compilers, web browsers, file and image viewers and editors, and so on. All commands yield a status value on termination. ... Почитайте man intro, man 2 intro, man 3 intro ... и познакомьтесь с тем, что содержат конкретные главы подсказки Linux, и с основами Linux в целом таким способом. cd 003. -------- Команда смены папки, в которой мы находимся (change directory) Познакомимся с некоторыми специальными именами: . текущая папка .. родительская папка (папка в которой лежит текущая папка). ~ моя домашняя папка ~user домашняя папка user'а с именем "user" Пример 3. [virtu@darkstar ~]$ cd /usr/lib [virtu@darkstar lib]$ cd ../src [virtu@darkstar src]$ pwd /usr/src [virtu@darkstar src]$ sudo -s [sudo] password for virtu: [root@darkstar src]# pwd /usr/src [root@darkstar src]# Сначала мы задали абсолютный путь /usr/lib (fully qualified name) - имя папки истинное где бы мы не находились - мы попадаем в /usr/lib, затем относительное имя ../src. Мы попадаем в /usr/lib/../src = /usr/src. Берем права рута без выхода из текущей папки: sudo -s Чтобы все сработало мы должны быть зарегистрированы суперпользователем в /etc/sudoers: [virtu@darkstar src]$ su -c "visudo" Password: ... virtu ALL=(ALL) ALL ls 004. -------- Eсли надо посмотреть вокруг и ответить на вопрос: какие файлы лежат в текущей папке, поможет команда ls. Команда эта сложная, и мы не будем изучать всех ее возможностей посмотрим лишь ключи -da1il --color и единственный аргумент - имя папки. -d показывать только папки (d - directories) -a показывать все файлы, в том числе имя которых начинается с точки (они считаются скрытыми файлами, например .bashrc) (a - all) -1 показывать в один столбец (1 - один) -i показывать i-node (номер узла, где начинается файл, см. устройство файловых систем еxt, ext2) -l показывать в длинном (l - long) формате - в одну колонку атрибуты + имя файла. Остановимся на этом подробнее. Любой файл обладает олним или несколькими именами (об этом в разделе о линках - ln) и рядом свойств, которые видны в строке ls -l) -rw------- 1 user user 289 2008-09-21 17:27 .bash_history drwxr-xr-x 2 root root 80 2008-10-12 14:00 bsg lrwxrwxrwx 1 root root 3 2008-10-12 14:00 cdrom -> sr0 brw-rw---- 1 root floppy 2, 0 2008-10-12 14:00 fd0 crw-rw---- 1 root uucp 4, 64 2008-10-12 14:00 ttyS0 в первом столбце 1я колонка свойства - dlbc d - файл в этой строке - папка l - файл в этой строке - линк b - файл в этой строке - блочное устройство c - файл в этой строке - последовательное устройство 2я 3я и 4я колонки - что владелец имеет право делать с этим файлом - - нет доступа r - читать w - писать x - исполнять 5я 6я и 7я колонки - что пользователь, входящий в группу владельца файла, имеет право делать с этим файлом - - нет доступа r - читать w - писать x - исполнять 8я 9я и 10я колонки - что пользователь, не входящий в группу владельца файла, но имеющий доступ к ОС, имеет право делать с этим файлом - - нет доступа r - читать w - писать x - исполнять Во втором столбце - сколько имен у файла, либо сколько папок в папке В третьем - имя владельца файла В четвертом - имя группы, к которой принадлежит файл В пятом - длина файла в байтах, либо мажорный, минорный номера скрипта MAKEDEV в шестом и в седьмом - временной штамп создания файла в восьмом - имя файла, символического линка -> файла. Пример 4. alias - Как подавить вывод от ls в цвете # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi alias ls='ls --color=none' # User specific aliases and functions touch 005. mkdir 006. rm 007. cp 008. mv 009. -------------------------- Группа команд предназначена для создания (touch, mkdir) файла / папки, уничтожения файла (rm filename) или папки с файлами (rm -rf foldername) -r - recursive, рекурсивно -f - force, насильственно. Копирование и перемещение файлов в точном соответствии с дадзибао III: cp old new # cp - copy mv old new # mv - move Пример 5. mv /home/user/source.c /usr/src # переместить файл source.c из # домашней папки юзера 'user' в # папку /usr/src chmod 010. ------------ Поменять права на файл, закодированные тройкой восмеричных цифр. Пример 10 chmod 664 source.c 0110110100 -rw-rw-r-- ... source.c безсмысленно давать обычному файлу атрибут папки. Теперь файл доступен владельцу и членам его группы для чтения и записи остальным пользователям только для чтения. chown 011. ------------ Поменять владельца файла. Пример 11. chown root source.c сделать рута владельцем файла source.c chgrp 012. ------------ Поменять группу файла. Пример 12. chgrp root source.c поместить файл source.c в группу root tar 013. ----------- В рассмотренных примерах ключи объединяют соединение файлов в один файл (Tape ARchive) и их сжатие (bzip2) Архивация # login as virtu. Должна существовать папка ~/abc. cd ~ tar -cvjf abc.tar.bz2 abc # c - create v - verbose j - bzip2 # f - file и распаковка файловых архивов. # login as virtu. Должна быть уничтожена папка ~/abc. cd ~ tar xvjf abc.tar.bz2 # x - eXtract v - verbose j - bzip2 # f - file Работа по созданию, уничтожению файловых систем и их поддержанию в рабочем состоянии. fdisk 014. mkfs/mkswap 015. fsck 016. du 017. df 018. free 019. dd 020. ----------------------------------------------- Разбивка диска на разделы - partitions и их уничтожение ведется командой fdisk. Команда имеет однобуквенные подкомады, где также как у большой ОС команда помощи (m - manual). Создать на сыром разделе файловую систему можно командой семейства mkfs, проверить исправность командой fsck. Пример 14. Создание раздела 6 типа ext3 на primary master диске с проверкой его исправности. [root@darkstar ~]# fdisk -l /dev/sda # l - list Disk /dev/sda: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x000340dc Device Boot Start End Blocks Id System /dev/sda1 * 1 480 3855568+ 83 Linux /dev/sda2 481 501 168682+ 5 Extended /dev/sda5 481 491 88326 83 Linux [root@darkstar ~]# [root@darkstar ~]# fdisk /dev/sda Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (492-501, default 492): Using default value 492 Last cylinder, +cylinders or +size{K,M,G} (492-501, default 501): 496 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks. ... [root@darkstar ~]# mkfs.ext3 /dev/sda6 mke2fs 1.41.9 (22-Aug-2009) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 10040 inodes, 40128 blocks 2006 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=41156608 5 block groups 8192 blocks per group, 8192 fragments per group 2008 inodes per group Superblock backups stored on blocks: 8193, 24577 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 22 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@darkstar ~]# fsck /dev/sda6 fsck from util-linux-ng 2.16.2 e2fsck 1.41.9 (22-Aug-2009) /dev/sda6: clean, 11/10040 files, 5867/40128 blocks [root@darkstar ~]# После монтирования раздела скажем на /mnt/sda6 можно поинтересоваться свободным пространством в разделе df (disk free) /dev/sda6 или размером занимаемой папки du -s /mnt/sda6, a также размером свободной оперативной памяти free. Командой dd (disk duplicate) можно скопировать часть или весь раздел диска либо весь диск (/dev/sda). Возможно также копирование пустого пространства с /dev/zero. Пример 20. dd if=/dev/sda6 of=/usr/src/myfile dd if=/dev/zero of=/usr/src/unformatted bs=512 count=200000 # 100M useradd 21. userdel 22. passwd 24. su 25. sudo 26. ------------------------------------------ В данном разделе речь в основном пойдет о команде sudo. Комада su, которая всегда должна сопровождаться ключем - : su -, что означает взять права рута оставив своё окружение (environment, без ключа мы автоматически перемещаемся в каталог пользователя root, оставленный им как активный в ходе последнего сеанса). Следует отметить, что su не работает в Ubuntu, так как пользователь root здесь скрытый. Использование команд useradd, userdel понятно и просто. Новому пользователю должен быть назначен пароль командой # passwd username Пользователи регистрируются в 2-х текстовых файлах следующего формата: Пример 25. etc/passwd root:x:0:0:root:/root:/bin/bash user_a:x:500:500::/home/user_a:/bin/bash user_b:x:501:501::/home/user_b:/bin/bash /etc/group root:x:0:root user_a:x:500: user_b:x:500,501: Пользователь user_a входит в группу user_a Пользователь user_b входит в группы user_a, user_b user_a: - первая колонка имя пользователя / имя группы x: - используется личный (групповой) пароли *: - не используются 500: - UID user identification 500: - GID group identification root - истинное имя пользователя, можно не заполнять :: /root: - домашняя папка пользователя /bin/bash - шелл по умолчанию sudo -s (s - shell) передать текущему пользователю права другого пользователя, мы передаем права рута. Для этого в файл настройки /etc/sudoers, в конце файла, командой visudo, делается запись: user_a ALL=(ALL) ALL где user_a, имя текущего пользователя. файл /etc/issue 27. uname (-a, -r) 28. dmesg 29. файл /etc/inittab 30. --------------------- Информацию о загруженном дистрибутиве Linux можо получить, прочитав файл /etc/issue и выход команды uname -r (r - release, версия ядра): [root@darkstar ~]# cat /etc/issue Fedora release 12 (Constantine) Kernel \r on an \m (\l) [root@darkstar ~]# uname -r 2.6.32.10-90.fc12.i686 [root@darkstar ~]# uname -m i686 Ключ -a (a - all, всё) выдает для человека всю информацию о ядре (human readable form), Пример 28. [root@darkstar ~]# uname -a Linux darkstar 2.6.32.10-90.fc12.i686 #1 SMP Tue Mar 23 10:21:29 UTC 2010 i686 athlon i386 GNU/Linux [root@darkstar ~]# Мы можем повторить вывод сообщений о последней загрузке системы подав команду dmesg. Система Linux в запущенном состоянии может находится в состоянии runlevel 0, 1, 2, 3, 4, 5, 6. Эти состояния отличаются друг от друга количеством автономно запущенных процессов. О текущем runlevel можно узнать поисследовав файл /etc/inittab. Если вы работаете в дистрибутиве Redhat, Centos либо Fedora то вам пригодится команда ntsysv. Обладателю Debian, Ubuntu посоветуем rcconf. Пример 30. Файл /etc/inittab. Система Fedora 12, Constantine [root@darkstar ~]# cat /etc/inittab # inittab is only used by upstart for the default runlevel. # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/event.d/rcS # # Individual runlevels are started by /etc/event.d/rc[0-6] # # Ctrl-Alt-Delete is handled by /etc/event.d/control-alt-delete # # Terminal gettys (tty[1-6]) are handled by /etc/event.d/tty[1-6] and # /etc/event.d/serial # # For information on how to write upstart event handlers, or how # upstart works, see init(8), initctl(8), and events(5). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: [root@darkstar ~]# по умолчанию система грузится в runlevel 5, запуская процессы из /etc/rc5.d (видны в ntsysv). II. Linux на рабочем столе. --------------------------- Не секрет что большинству людей лень досконально изучать Linux, не столь модную и набитую модными технологиями (OLE, COM+, .NET) операционную систему, сколь на столе (desktop) ею является Windows (в Windows указанные технологии были первенцами, система имеет доступную цену, наконец, благодаря Интернету, её просто украсть). Рассмотрим поэтому в первую очередь две самые массовые операции Linux - установку дистрибутива операционной системы (ОС) на жесткий диск, - установку (install) приложений (applications) на рабочую ОС. Для установки ОС в дополнение к существующей, достаточно взять популярный live-дистрибутив LInux (Ubuntu, Fedora, openSuse, Mandriva и т. п.) и воспользоваться подходящим режимом волшебника (wizard) установки. При более близком знакомстве можно воспользоваться программами grub, fdisk и parted. Прост в использовании live диск gParted (gparted.sourceforge.net). С помощью этого диска вы легко осуществите переразбивку диска с Windows XP или старше. Windows 7 сам по себе содержит средства реорганизации партиций. Мультизагрузкой обычно занимается программа grub. Большая ее часть расположена в папке /boot/grub на активном разделе Linux, в то-же время собственно загрузчик записан на нулевой дорожке жесткого диска. Пример 2.1. Установка grub 0.97 (Fedora 12, Constantine) [root@darkstar ~]# grub grub> find /boot/grub/stage1 find /boot/grub/stage1 (hd0,0) grub> root (hd0,0) root (hd0,0) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) grub> setup (hd0) setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 30 sectors are embedded. Succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+30 p (hd0,0)/boot /grub/stage2 /boot/grub/grub.conf"... succeeded Done. grub> quit quit [root@darkstar ~]# С помощью программы fdisk хорошо манипулировать разделами при еще неустановленном Windows, создадим например разбивку из 3-х разделов: Windows XP, Linux, Linux-swap 20ГБ primary-slave диска : Пример 2.2 [root@darkstar ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel. Building a new DOS disklabel with disk identifier 0x1f36dd52. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. The number of cylinders for this disk is set to 2610. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 ast cylinder, +cylinders or +size{K,M,G} (1-2610, dflt 2610): +10G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (1307-2610, default 1307): Using default value 1307 Last cylinder, +cylinders or +size{K,M,G} (1307-2610, dflt 2610): +8G Command (m for help): n Command action e extended p primary partition (1-4) e Partition number (1-4): 3 First cylinder (2352-2610, default 2352): Using default value 2352 Last cylinder, +cylinders or +size{K,M,G} (2352-2610, dflt 2610): Using default value 2610 Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (2352-2610, default 2352): Using default value 2352 Last cylinder, +cylinders or +size{K,M,G} (2352-2610, dflt 2610): Using default value 2610 Command (m for help): t Partition number (1-5): 5 Hex code (type L to list codes): 82 Changed system type of partition 5 to 82 (Linux swap / Solaris) Command (m for help): a Partition number (1-5): 1 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@darkstar ~]# Созданы 10ГБ Windows раздел (/dev/sda1) 8ГБ Linux раздел (/dev/sda2) 2ГБ раздел подкачки Linux (/dev/sda5) На такой диск операционные системы легко устанавливаются с помощью волшебников (wizard) при желании можно предварительно отформатировать разделы вручную Пример 2.3 mkfs.ntfs /dev/sdb1 mkfs.ext3 /dev/sdb2 mkswap /dev/sdb5 После чего диск физически переустанавливается как primary master, установка операционных систем ведется на primary-master диск. Установка приложений в дистрибутиве Ubuntu. ------------------------------------------- C недавнего времени система Ubuntu (дистрибутивы 9.10, Ubuntu Software Center 10.04 LTS) обзавелась Windows-подобным графическим приложением "Добавить - убрать программы". Всё, что нужно знать - как Ubuntu обновляется - вначале происходит синхронизация списков пакетов (update - процесс), затем обновление и синхронизация самих установленных пакетов (upgrade - процесс), затем установка приложения наиболее свежей доступной версии (install - процесс) с указаного списка репозиториев (файл /etc/apt/sources.list). Установка приложений в дистрибутиве Ubuntu программой apt. ---------------------------------------------------------- Update процесс # apt-get update Upgrade процесс # apt-get upgrade либо apt-get dist-upgrade Инсталляция # apt-cache search <имя приложения> # apt-get install <имя приложения> Деинсталляция # apt-get autoremove --purge <имя приложения> Пример 2.3 файл /etc/apt/sources.list из Ubuntu 10.04. #deb cdrom:[Ubuntu 10.04 LTS _Lucid Lynx_ - Release i386 (20100429)]/ lucid main restricted # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://ee.archive.ubuntu.com/ubuntu/ lucid main restricted deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid main restricted ## Major bug fix updates produced after the final release of the ## distribution. deb http://ee.archive.ubuntu.com/ubuntu/ lucid-updates main restricted deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid-updates main restricted ## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu ## team. Also, please note that software in universe WILL NOT receive any ## review or updates from the Ubuntu security team. deb http://ee.archive.ubuntu.com/ubuntu/ lucid universe deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid universe deb http://ee.archive.ubuntu.com/ubuntu/ lucid-updates universe deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid-updates universe ## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu ## team, and may not be under a free licence. Please satisfy yourself as to ## your rights to use the software. Also, please note that software in ## multiverse WILL NOT receive any review or updates from the Ubuntu ## security team. deb http://ee.archive.ubuntu.com/ubuntu/ lucid multiverse deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid multiverse deb http://ee.archive.ubuntu.com/ubuntu/ lucid-updates multiverse deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid-updates multiverse ## Uncomment the following two lines to add software from the 'backports' ## repository. ## N.B. software from this repository may not have been tested as ## extensively as that contained in the main release, although it includes ## newer versions of some applications which may provide useful features. ## Also, please note that software in backports WILL NOT receive any review ## or updates from the Ubuntu security team. # deb http://ee.archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse # deb-src http://ee.archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse ## Uncomment the following two lines to add software from Canonical's ## 'partner' repository. ## This software is not part of Ubuntu, but is offered by Canonical and the ## respective vendors as a service to Ubuntu users. # deb http://archive.canonical.com/ubuntu lucid partner # deb-src http://archive.canonical.com/ubuntu lucid partner deb http://security.ubuntu.com/ubuntu lucid-security main restricted deb-src http://security.ubuntu.com/ubuntu lucid-security main restricted deb http://security.ubuntu.com/ubuntu lucid-security universe deb-src http://security.ubuntu.com/ubuntu lucid-security universe deb http://security.ubuntu.com/ubuntu lucid-security multiverse deb-src http://security.ubuntu.com/ubuntu lucid-security multiverse Пакеты Ubuntu и dpkg. --------------------- В простейшем случае файл это некоторое количество битов информации (тело файла плюс имя файла). В более сложых случаях файл хранит в себе ряд свойств (атрибутов). Имя плюс некоторое количество файлов, составляют пакет. Имя плюс некоторое количество пакетов - приложение (application). Чтобы установить приложение необходимо собрать головной пакет и зависимые пакеты, пакеты без которых головной пакет не сможет работать. Говорят, что пакеты образуют дерево зависимостей (dependance tree). Всю работу по сборке дерева автоматически выполняет программа apt. Если есть желание повозиться со сборкой приложения вручную (например когда apt деинсталлирована) программа dpkg позволяет осуществить целый ряд запросов (queries) к базе данных доступных или установленных пакетов. Linux packaging info http://www.pixelbeat.org/docs/packaging.html установить/обновить пакет install/upgrade package file(s) dpkg -Gi package(s).deb удалить пакет remove package dpkg -r package показать список имён установленных пакетов show all packages (names only) dpkg-query --showformat='${Package}\n' показать список имён установленных пакетов имя которых содержит слово "spell". show all packages whose names contain the word spell dpkg -l '*spell*' показать версию установленного пакета "package" show version of package installed dpkg -l package показать метаданные установленного пакета "package" show all package metadata dpkg -s package какому пакету принадлежит файл "file" what package does file belong dpkg -S /path/file дать список мест, где установлены файлы пакета "package" list where files were installed dpkg -L package дать список мест, где будут установлены файлы пакета "package.deb" list where files would be installed dpkg -c package.deb перечислить файлы/пакеты в которых нуждается пакет "package" list files/packages that package needs dpkg -s package | grep ^Depends: перечислить пакеты которые нуждаются в пакете "package" list packages that need package (see also whatrequires) dpkg --purge --dry-run package Fedora. Запросы на основе программы rpm. ---------------------------------------- Аналогично dpkg запросы к пакетам строятся с помощью программы rpm в линейке дистрибутивов Redhat. установить/обновить пакет install/upgrade package file(s) rpm -Uvh packages(s).rpm удалить пакет remove package rpm -e package показать список имён установленных пакетов show all packages (names only) rpm -qa показать список имён установленных пакетов имя которых содержит слово "spell". show all packages whose names contain the word spell rpm -qa '*spell*' показать версию установленного пакета "package" show version of package installed rpm -q package показать метаданные установленного пакета "package" show all package metadata rpm -q -i package какому пакету принадлежит файл "file" what package does file belong rpm -q -f /path/file дать список мест, где установлены файлы пакета "package" list where files were installed rpm -q -l package дать список мест, где будут установлены файлы пакета "package.rpm" list where files would be installed rpm -q -l -p package.rpm перечислить файлы/пакеты в которых нуждается пакет "package" list files/packages that package needs rpm -q --requires package перечислить пакеты которые нуждаются в пакете "package" list packages that need package (see also whatrequires) rpm -q --whatrequires package III. Фильтры и Скрипты. ----------------------- Оболочка (в нашем случае BASH) всегда держит открытыми три файла stdin (standard input) stdout (standard output) и stderr (standard error). II дадзибао определяет 4 стандартных операции над файлами (open) получить структуру, описывающую файл, и выдать номерок (индекс) хранения структуры, освободить память для хранения структуры, а на просьбу открыть закрытый файл по индексу, отвечать кодом ошибки (close). Таким образом, сразу после запуска шелла можно начинать запись (write) в файл, открытый с индексом 0 stdin, и чтение (read) из файлов с индексами 1 - stdout и 2 - stderr. Пример 3.1 Файл с именем "abc" содержит следующий текст one two three quattro Подадим команду: spell < abc При этом файл abc был через stdin прочитан программой spell. Слова one, two, three английские и напечатаны без ошибок, на stdout (текущая консоль) будет выведено итальянское слово quattro. spell - типичная программа-фильтр (читает информацию с stdin выводит на stdout). < 0< > 1> 2> 1>> >& |& --------------------------------------- типичные операторы перенаправления стандартных входа и выходов, значок & означает,что происходит слияние стандартных файлов (обычно stdout и stderr). Пример 3.2 # X -help 2>&1 1| less файл помощи, обычно видимый на stdout получен на stderr. stderr сливается с stdout в один поток (файл), который пропущен через фильтр less, позволяющий листать информацию постранично или построчно. Простота, с которой строятся программные конвейеры, полезна прежде всего при написании скриптов - фрагментов кода, часто используемых повторно. Примеры sed и grep фильтров. ---------------------------- Отложим рассмотрение программ sed и grep как фильтров, так как сначала стоит познакомиться с "регулярными выражениями". Другие полезные фильтры ----------------------- сat (concatenate) --------------------- фильтр поглощающий и выводящий текст из файлов. Служит как средство слияния файлов cat < file0 file1 file2 > filesum или проще cat file0 file1 file2 filesum либо как срелство ренумерации строк (ключ -n). Пример # cat one two | cat -n на консоль будет выведено перенумерованное единым списком содержимое файлов one и two. more less (less, постраничный обзор) ---------------------------------- Фильтр поэкранного обзора документа. Фильтр less написан как более мощная альтернатива фильтру more (листание назад и др.). Пример # less --help | less tee. ---- Фильтр ветвления. Файл читается на stdin, выводится две копии - в файл аргумент и на stdout/ Пример. Cосчитать строки и вывести текст из файла # cat myfile | tee fi | wc -l; cat fi; rm fi head tail. ----- Фильтры начала и конца файла. Команды выводят первые/последние 10 (n - с ключем -n) строк текста из файла, имя которого дано в качестве аргумента. wc. --- Фильтр подсчета (-c characters -w words -l lines). По умолчанию (без ключей) выводятся все 3 числа (wc -cwl). Пример # cat myfile one two three four quattro # cat myfile | wc 4 5 27 tr (translate) -------------------- Фильтр - переводчик. Never write it in 'C' if you can do it in 'awk'; Never do it in 'awk' if 'sed' can handle it; Never use 'sed' when 'tr' can do the job; Never invoke 'tr' when 'cat' is sufficient; Avoid using 'cat' whenever possible. --Taylor's Laws of Programming bzip2 gzip ------ Пакующие фильтры. Пример Упаковать папку /sbin cd / tar cv sbin | bzip2 > syspart.tar.bz Распаковать папку /sbin cd / rm -rf sbin cat syspart.tar.bz | bzip2 -d > tar xv dd --- Фильтр копирования сырых устройств Пример. Создать имидж 3.5 дюймового флоппи диска. dd < /dev/zero > /home/user/bigfile bs=512 count=`expr 160 \* 18` Обратите внимание на нестандартный синтаксис ключей dd ключ=значение Программы, полезные при написании скриптов: seq. ------------------------------------------------ Программа печатает последовательность целых чисел. Пример seq 10 1 2 3 4 5 6 7 8 9 10 seq 3 10 3 4 5 6 7 8 9 10 seq 3 2 10 3 5 7 9 Программы, полезные при написании скриптов: test. ------------------------------------------------- Программа выводит результат в переменную $?, где 0 соответствует истина (true) а не нулю - ложь (false, 1) Сравнение целых чисел -eq $a равно $b (is equal to, $a -eq $b) -ne $a не равно $b (is not equal to, $a -ne $b) -gt $a больше чем $b (is greater than, $a -gt $b) -ge $a больше либо равно $b (is greater than or equal to, $a -ge $b) -lt $a меньше чем $b (is less than, $a -lt $b) -le $a меньше либо равно $b (is less than or equal to, $a -le $b) Пример test 2 -gt 3 echo $? 1 test 2 -gt 1 echo $? 0 Логические выражения (expression) изменить нормальную последовательность операторов (override normal precedence of the operators) ! expression не логический (logical not) -a и логический (logical and) -o или логический (logical or) Сравнение строк -z пустая строка нулевой длины (string is "null", that is, has zero length) -n строка ненулевой длины (string is not "null"). = строки равны (is equal to, $a = $b) != строки не равны (is not equal to, $a != $b) \< строка меньше строки (в алфавитном порядке ASCII), (is less than, in ASCII alphabetical order, $a \< $b, Note that the "<" needs to be escaped). \> строка больше строки (в алфавитном порядке ASCII), (is greater than, in ASCII alphabetical order, $a \> $b, Note that the ">" needs to be escaped). Файловая система -e файл существует (file exists) -f существующий файл - регулярный (не папка не устройство не труба не гнездо и не ссылка) (file is a regular file) -s файл не нулевой длины (file is not zero size) -d файл - это папка (file is a directory) -b файл - это блочное устройство (file is a block device: floppy, cdrom, etc.) -c файл - это символьное устройство (file is a character device: keyboard, sound card, etc.) -p файл - это труба (file is a pipe) -S файл - это гнездо (file is a socket) -L файл - это ссылка (file is a symbolic link) -r файл разрешен для чтения (file has read permission) -w файл разрешен для записи (file has write permission) -x файл разрешен для исполнения (file has execute permission) -g файл с установленным group-id флажком. (group-id flag set on file) -u файл с установленным user-id флажком. (user-id flag set on file) -k файл с установленным "липким битом", если пользователь не является владельцем папки с установленным "липким битом" то он не может стереть даже свои файлы из этой папки ("sticky bit" set, if user does not own a directory that has the sticky bit set, she cannot delete files in it, not even files she owns) -O Вы - владелец файла (you are owner of file) -G group-id файла совпадает с Вашим (group-id of file same as yours) -t n дескриптор файла n открыт (обычно 0 - 2 stdin, stdout, stderr) (file descriptor n is open. This usually refers to stdin, stdout, and stderr: file descriptors 0 - 2). f1 -nt f2 файл f1 новее f2 (file f1 is newer than f2) f1 -ot f2 файл f1 старше f2 (file f1 is older than f2) f1 -ef f2 файлы f1 и f2 ссылки (алиасы) одного и того же файла (files f1 and f2 are links to the same file) Программы, полезные при написании скриптов: expr. ------------------------------------------------- expr - калькулятор командной строки - оперирует целыми числами и строками. Операции с целыми числами: (+ - * / %) + плюс (plus) - минус (minus) * умножение (multiplication) / деление (division) % остаток деления (modulo - returns the remainder of an integer division) Пример. Вычислить количество байт на стандартной дорожке трехдюймового флопи-диска. virtu@darkstar:~$ expr 18 \* 512 9216 Зачем нужна обратная косая перед знаком умножения, смотрите ниже в разделе "Backslashing". Операции над строками: (index substr length match) # index: В подстроке ищем слева направо первый символ, который встречается также в строке. Печатаем позицию найденного символа в строке (слева направо, самый левый символ первый, если совпадений небыло печатаем 0) (position in string of first character in substring that matches). Пример. a=1234zipper43231 b=`expr index $a 23` echo Numerical position of first 2 in $a is $b. Numerical position of first 2 in 1234zipper43231 is 2. # substr: печатаем подстроку по указанным строке, первому символу подстроки в строке, и длине подстроки (print substring, starting position & length specified). Пример. a=1234zipper43231 b=`expr substr $a 2 6` echo Substring of $a, starting at 2 and 6 chars long is $b. Substring of 1234zipper43231, starting at 2 and 6 chars long is 234zip. # length: Длина строки. (length of the string) Пример. a=1234zipper43231 b=`expr length $a` echo Length of $a is $b. Length of 1234zipper43231 is 15. # 'match' работает аналогично команде 'grep' (operates similarly to 'grep'). Пример. a=1234zipper43231 b=`expr match $a [0-9]*` echo Number of digits at the beginning of $a is $b. Number of digits at the beginning of 1234zipper43231 is 4. b=`expr match $a '\([0-9]*\)'` echo The digits at the beginning of $a are $b. The digits at the beginning of 1234zipper43231 are 1234. Backslashing. ------------- Наш алфавит замкнут с обеих сторон (ASCII), поэтому мы не можем доопределять символы с новым значением. Выход в назначении специального символа перехода в параллельный алфавит (backslash, отсюда "backslashing"). Пример старый алфавит: A B Z \ a b z новый алфавит: A B a b //, в новом алфавите не должно быть // символа \ \\ - теперь означает то же, что раньше \ z - теперь означает то же, что раньше z, в новом алфавите z не существует. \a - теперь означает то же, что раньше a a - теперь команда из нового алфавита. Команда expr 18 \* 512 исполняется оболочкой BASH поэтому символ "*" в ней имеет другой смысл, чем умножение (это вовсе один из метасимволов регулярных выражений). Для передачи его без искажений в команде expr и используется механизм "backslashing". Регулярные выражения. --------------------- В 1940е годы, Warren McCulloch и Walter Pitts моделировали нейроны, как конечные автоматы с целью описания нервной системы. В 1956 году Steve Kleene придумал математическую абстракцию для описания этих моделей, назвав ее регулярными множествами. Регулярое выражение, это способ записи множества строк. Поскольку множество может иметь бесконечное число членов мы не можем просто перенумеровать его. Существует 4 операции для создания регулярных выражений 1. Kleene closure (повторение) * 2. Alternation (выбор) | 3. Concatenation (конкатенация) none 4. Grouping (группирование) () Следующая таблица иллюстрирует их на примере Операция Регулярное выражение Да Нет .................................................................. Повторение ab*a aa ab (Kleene closure) aba abba Выбор aa | baab aa любая другая строка (Alternation) baab Concatenation aabaab aabaab любая другая строка Grouping a(a|b)aab aaaab любая другая строка abaab Оператор * имеет высший приоритет, затем | ,затем конкатенация. Если мы хотим обозначить множество строк a, aba, ababa, abababa и так далее, мы должны записать (ab)*a для указания того, что шаблон ab должен повторятся целиком, без разрыва. Robert Sedgewick, Kevin Wayne, Принстонский Университет, 2004 ----------------------------------------------------------------------- Полезные расширения: . обозначает любой одиночный символ $ обозначает конец строки ^ обозначает начало строки [Ci-Cj] обозначает любой из символов между Ci и Cj ? повторить предыдущий символ 0 или 1 раз * повторить предыдущий символ 0 или более раз + повторить предыдущий символ 1 или более раз {n} повторить предыдущий символ в точности n раз {n,m} повторить предыдущий символ хотя бы n раз но не более m раз \ переключатель между обычным и расширенным алфавитами (метасимволы). Например \$ обозначает доллар а не конец строки. grep. ----- grep (-i, -v, -r, -n -H) 'regexp' [filename] Вначале разберем те ключи программы grep, которыми мы намерены воспользоваться. -i ignore case -v invert -r recursive -H --with-filename. Print the file name for each match. This is the default when there is more than one file to search. -n --line-number. Prefix each line of output with the 1-based line number within its input file. (-n is specified by POSIX). 'regexp' - регулярное выражение, в простейшем случае просто фрагмент строки, который мы ищем. [filename] - если имена файлов неудобно передавать по трубе (ключ -r) они могут быть сообщены программе как параметр. Пример. cat *.sh | head -n 1 | grep ^#! # Найти скрипты среди .sh файлов # в текущей папке (файл начинается # с #!). Более сложные регулярные выражения приводятся в разделе "Ну и что со всем этим делать, или практическое использование UNIX". Потоковый редактор sed. ----------------------- Многим знакомо средство "Find and Replace" в текстовых редакторах Windows. Единый синтаксис в sed, ed и vi, наличие поиска с помощью регулярных выражений делает это средство в Linux необычайно мощным с возможностью его использования в скриптах: s/Find_regexp/Replace_To/g || | | | || ||search re- |replace ||globally, everywhere in string ||gular exp- |text with | ||ression | |single character representing search and |search and replace replace borders ( /, #, etc.) Пример. Найти и заменить слово Beatles на Rolling Stones во всем файле. cat BeatlesFile | sed s'Beatles/Rolling Stones/'g > RSFile awk. ---- AWK - это интерпретатор сложного языка оброаботки текстов, из которого нам понадобится совсем немного: перестановка и выборочная печать столбцов таблицы, записанной в "plain ASCII" файл, печать длины строки такого же файла: awk '{print $4, $1, $2}' awk '{print length}' Странные редакторы ed и vi. --------------------------- Редактор ed. Создание файла с именем lesson1.txt в домашней папке. ------------------------------------------------------------------ Переходим в домашнюю папку $ cd ~ Убедимся, что мы находимся в домашней папке $ pwd /home/user Если вас зовут user то домашней будет папка /home/user Запускаем текстовый редактор. $ ed lesson1.txt Peдактор имеет два режима работы - командный и редактирования. Переход в другой режим и команды в нем однобуквенные, все это сильно напоминает идею с "backslicing" да и автор тот же (Ken Thompson). Изначально редактор находится в командном режиме, подсказка не выводится. Вывести статус бар ("*") командной строки следует командой P Редактор не имеет курсора, все "редактирование" выполняется посредством четкой адресации и знания регулярных выражений: номер_строкикоманда начальная_строка,конечная_строкакоманда Файл начинается в первой строке, заканчивается строкой номер $ Пример. Печатать на консоль весь файл (p - print) 1,$p Помимо команды "p" полезно знать команды a - append text i - insert text (очевидно безсмысленно делать инсерт в пустой файл нулевой длины). s - search and replace (синтаксис заимствован у команды sed). . - exit edit mode будучи введенной в первой, самой левой колонке строки, это единственная команда, которая работает в режиме редактирования. w - save (write, w filename) q - exit Редактор vi. Создание файла с именем lesson1.txt в домашней папке. ------------------------------------------------------------------ Приведенные команды редактора ed работают в vi. Переходим в домашнюю папку. Убедимся, что мы находимся в домашней папке. Запускаем текстовый редактор. $ vi lesson1.txt Наименьшее количество проблем возникнет, если удастся свыкнуться с мыслью, что на клавиатуре есть только кнопки основной группы: [ESC][1][2][3][4][5][6][7][8][9][0][-][=][ <-- ] [Q][W][E][R][T][Y][U][I][O][P][[][]] [A][S][D][F][G][H][J][K][L][;]['] [Enter] [Shift] [Z][X][C][V][B][N][M][,][.][/] [ Space ] Peдактор имеет три режима работы - режим ввода (В) - режим правки (П) - командный режим (К) Переход между режимами: В -> П Esc В -> К Esc : П -> В i (insert, вставка) или a (append, дополнить) П -> К : К -> В Esc i К -> П Esc Перемещаться по тексту следует в режиме правки кнопками. В этом же режиме осуществляется простое редактирование. h - влево, "а не в Хвост строки" j - вниз, "а не Йог левитирующий" k - вверх, "а не "Копать" l - вправо, "a не "наЛево" x - удалить текущий символ "крест поставить" r - заменить текущий символ "replace" Шутки, заключенные в кавычки призваны помочь запомнить кнопки редактора vi-vi-vi. Текущий объект отмечен курсором (чтобы не утек). Oперации с текущей строкой. dd - (delete) удалить и забрать в буфер yy - (yank) забрать в буфер текущую строку p - (paste) поместить под текущей строкой содержимое буфера обмена. Сохранить файл можно командой (переходим в командный режим) w или w имя_файла Выход из редактора также осуществляется в командном режиме q выход wq выход с сохранением q! выход без сохранения Ссылки и литература на русском языке https://www.ibm.com/developerworks/ru/edu/l-vi/index.html Программирование скриптов на BASH. ---------------------------------- Обойдемся более универсальным подмножеством языка BASH: SH, кроме того мы знаем довольно много такого, что пригодится как составные части языка - seq, test, expr, регулярные выражения. Важно понять последовательность изучения императивного языка, а SH таковым является, такую, чтобы мы получили полноценный язык программирования как можно быстее, а потом лишь делали его более удобным. Комментарии Константы и переменные Операции Функции --- Полноценный язык, можем запрограммировать любой алгоритм --- Операторы управления потоком исполнения (if, while, do, for). Нам потребуется знать основные принципы заложенные в язык SH - дадзибао языка: - Все переменные - стринговые. - Чтение переменных - с префиксом $, запись без. - Использование встроенных переменных $? (exit code), $#, $*, $0..$9 (argc, argv[]) - Понимать сильное - '', слабое - "" и перенаправляющее - `` цитирование. (Understand strong - '', weak - "" and redirecting - `` quotation). - Использовать функцию (программу) expr для арифметических и строковых вычислений (Use expr function for arithmetics and string manipulation). - Использовать функцию (программу) test для логических операций и сравнений. Результат в $?. (Use test for logical operations and comparison. Result is in $?). 1. Комментарии #!/bin/bash # # первая строка сообщает системе, какая оболочка должна быть # использована с этим скриптом. 2. Данные в коде. Строки 'this is $strong quoting' # значения переменных # не подставляются "this is $weak quoting" # значения переменных # подставляются `expr 2 + 3` # 5 результат # перенаправляется 3. Значения переменных (Variable data in code) Все первичные типы (All primary types of data) - булева boolean, - битовый массив bit set, - конечное целое finite integer, - число с плавающей точкой floating point number хранятся как форматированная строка - в форме удобной для чтения человеком (are stored as formatted strings - in human readable form). Переменные не требуют декларирования (Variables does not require declaration). Более новые версии BASH поддерживают одномерные массивы. (Newer versions of bash support one-dimensional arrays). (a[3]=Abcd) Структуры и контейнеры недоступны (Structures and Containers are not available). $ VAR = "My variable" # создать / писать в (create / write) $ echo $VAR # читать (read) $ unset $VAR # освободить память размещенную под $VAR # (free memory allocated to $VAR). Встроенные переменные (Special variables) $? вернуть код возврата последней команды (return code of the last command) $# число аргументов командной строки (number of command line arguments) $* все аргументы в строке одной строкой (whole string of arguments as one string) $0 имя файла скрипта (script filename) $1 .. $n аргументы командной строки (command line arguments) 4. Выражения. Выражения вычисляются с помощью утилиты expr. 5. Управление потоком команд. Утилита test ------------ Использовать утилиту "test" для вычисления булевого значения выражения. Результат возвращается в exit коде: 0 - истина, 1 - ложь и хранится как значение встроенной переменной $?. Операторы --------- exit N - выйти из скрипта с exit кодом N if test expression then ... fi while test expression until test experssion do do ... ... done done break - используйте этот оператор, чтобы выйти из do-done цикла continue - используйте этот оператор, чтобы продолжить на следующей итерации (use this operator to resume next iteration). for vVar in 1 2 4 8 do echo $vVar done Замечание 1: Используйте for vVar in *; do ... ;done чтобы итерировать по файлам в текущей папке Замечание 2: Используйте утилиту seq для генерации списков seq 5 # (stop) 1 2 3 4 5 seq 3 5 # (start stop) 3 4 5 seq 3 2 7 # (start step stop) 3 5 7 Замечание 3: Несколько операторов в одной строке отделяются через ; for vVar in Alpha Beta Gamma; do echo $vVar done Замечание 4: Синтаксис оператора - переключателя показан на примере : case $vVar in "$condition1" ) command... ;; "$condition2" ) command... ;; esac Пример. #!/bin/bash case $1 [a-z] ) echo "строчные буквы";; [A-Z] ) echo "ЗАГЛАВНЫЕ БУКВЫ";; [0-9] ) echo "Цифры";; * ) echo "Знаки препинания, пробелы или другое";; esac # Допускает диапазон символов в [квадратных скобках]. 6. Видимость и энкапсуляция - Записывайте каждую функцию в отдельный файл. - Если исключительно скрипт ascript использует функцию foo, ascript_foo рекомендуется как имя файла для функции. - В остальных случаях имя anamespace_foo подходит для функций, используемых более чем одним скриптом. 7. Как вводить данные - с командной строки (from command prompt) % read a # теперь вводите значение для только-что созданной переменной a. % echo $a % echo # ожидайте нажатия клавиши. - внутри тела исходного текста скрипта cat > /etc/resolv.conf < - exec (из файла) #!/bin/sh group=pa05b exec < pa05b_people while read user pass surename name do useradd $user -g 1009 -c $surename"_"$name echo $user":"$pass | chpasswd mkdir /home/$user/public_html chown $user:$group /home/$user chown $user:$group /home/$user/public_html chmod 755 /home/$user chmod 755 /home/$user/public_html cp index.php /home/$user/public_html/ chown $user:$group /home/$user/public_html/index.php done Текстовые и двоичные файлы. Компиляция. --------------------------------------- Любой компьютер исполняет команды, плохо понятные человеку. Если каждой команде поставить в соответствие набор из слов: метка | мнемокод команды | аргументы команды | имя переменной: data значение данных то вместо того, чтобы говорить о программировании в машинных кодах, говорят о программировании на языке ассемблера - программах, записанных в виде исходных текстов. Перевод таких файлов в машинный код может быть осуществлен автоматически с помощью программы транслятора - ассемблера. Исходные тексты на языке ассемблера зависят от типа процессора - можно говорить о машиннозависимом языке. Мечтой многих программистов является составление программ на машиннонезависимом языке - если такой текст может быть автоматически транслирован в ассемблер конкретного процессора построчно, то говорят о языке интерпретируемого типа ( Basic ), если минимальной транслируемой единицей служит логический блок - компилируемых языках ( {}, C ). Необходимый набор программного обеспечения для компиляции машинно- независимых текстовых файлов в двоичные файлы машинных кодов - compiler, linker и программа загрузки этих кодов в оперативную память loader - входят в состав ОС либо инсталлируются в нее. ЧАСТЬ II. Ну и что со всем этим делать, или практическое использование UNIX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Постройка полноценной графической подсистемы. --------------------------------------------- 1. Cкачиваем минимальную систему Ubuntu, leafs: grub-pc logrotate linux-virtual ubuntu-minimal 2. Достраиваем гном и графику apt-get install ubuntu-desktop # 482 MB of archives, 1095 packages 3. startx 800x600. При следующей загрузке Вы сразу получите нормальный для Ubuntu графический режим аутентифиации пользователя со следующим сообщением об ошибке: could not update ICEauthority file /home/virtu/.ICEauthority вы можете его проигнорировать или остается пожелать успеха на форумах в интернете по его устранению: "Welcome to Linux". Регистрация / исключение из списков пользователей UNIX. ----------------------------------- #!/bin/sh # fedora script group=pa05b groupadd $group; exec < pa05b_people while read user pass surename name do useradd $user -g `cat /etc/group | tail -n 1 | sed s'/:/ /'g | awk '{print $3}'` -c $surename"_"$name echo $user":"$pass | chpasswd mkdir /home/$user/public_html chown $user:$group /home/$user chown $user:$group /home/$user/public_html chmod 755 /home/$user chmod 755 /home/$user/public_html cp index.php /home/$user/public_html/ chown $user:$group /home/$user/public_html/index.php done #!/bin/bash exec < kamin while read pkgname do echo $pkgname done #!/bin/bash exec < kamin count=0 while read pkgname do echo $pkgname, $count count=`expr $count + 1` done #!/bin/bash exec < kainit count=0 while read pkgname do echo $pkgname cat kamin | grep "^$pkgname$" | cat -n count=`expr $count + 1` done ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Binary tools recommended for portable Unix scripts: echo TRUE cp touch cat FALSE mv tar tr ln cmp sed expr rm diff awk test mkdir egrep seq rmdir grep ls sort pwd sleep leafs (debian) #!/bin/bash # discover leafs on the package three for i in `dpkg-query --showformat='${Package}\n' --show` do dpkg --purge --dry-run $i 2> /dev/null 1| grep "^Would remove or purge" done Процессы. --------- Основная деятельность Browse, Download: Install. Networking. Script kiddies: Text editors, search with regular expressions and filtering, BASH. Programmers: gcc, gdb, cpp, make, strip, yacc & lex. 10. Protsessid ------------- ps (-A), kill (-9), killall, top, nice, job, fg, bg Installeerimine ------------------- yum (install remove search), rpm (-q -a -i -e -v -h -U) rpm -Uvh zypper (install, remove, search) apt-get (install, remove, autoremove), apt-search, apt-src dpkg (-i, -r), dpkg-query Võrgud ------ ping, traceroute, ifconfig, route, nslookup, dig /etc/resolv.conf nameserver 193.40.160.3 Muu ------- crontab, mail Ymbersuunamine stdin, stdout, stderr ------------------------- >, >>, <, |, (0<, 1>, 2>), |&, >&, >>& (2>&1), tee grep (-i, -v, -r, -l -n -H) 'regexp' [filename] ( ^ $ . [A-Za-z] [0123] [^A] () | ) cat (-n), wc (-l, -c, -w), less, more, head (-n 3), tail (-n) tr, sed, gawk '{ print $3,$1 }', sort, uniq (-u), paste Teksti redaktorid ----------------- vi, ed, nano Skriptimine ----------- #!/bin/bash, muutujad, "", '', `` test (-lt -le -eq -ge -gt), if .. ; then .. ; fi while .. ; do .. ; done for $x in .. ; do .. ; done seq, expr (index length match substr) 13. Süsteemi arendamine ----------------------- gcc, gdb, cpp, make, strip 5.4 Ülekatetega struktuur (Overlay) Ülekatetega programmistruktuuri kasutamine on veel üks mälu kokkuhoiu meetod. Programmi loomisel jagatakse ta osadeks ja kirjeldatakse, millised neist võivad programmi töö ajal hõivata ühte ja sama mälupiirkonda (joonis 5.2). ======================================================================= oma olemuselt on põhimälu vaid ajutine hoidla, vajab arvutisüsteem sekundaarset välismälu. Protsessiks nimetatakse töötavat programmi ja ta on süsteemis peamine tööühik. Kuna mitmed protsessid võivad nõuda üheaegselt sama ressurssi, on operatsioonisüsteemi ülesandeks otsustada, millised neist nõuetest ja millises järjekorras rahuldada nii, et arvutisüsteemi töö oleks efektiivne. Üks äärmuslik variant loeb operatsioonisüsteemi komplekti kõik vajaliku, kui arvuti ostetakse. Teine äärmus on lugeda operatsioonisüsteemiks programmi, mis töötab kogu arvuti töö ajal (tuum, kernel), ja kõiki teisi programme rakendusprogrammideks 5. Näidata programmi töötlusetapid. Dünaamile laadimine. Dünaamile linkimine. 5.4 Ülekatetega struktuur (Overlay). Programmi loomisel jagatakse ta osadeks ja kirjeldatakse, millised neist võivad programmi töö ajal hõivata ühte ja sama mälupiirkonda. 5.5 Swapping Põhimälu kasutamine võib olla efektiivsem, kui lubada protsessid mälust ajutiselt välja laadida, vabastades piirkonna teiste protsesside tööks. Sellist tegevust nimetatakse swapping ja seda kasutab enamik operatsioonisüsteemidest. 5.6. Garbage collection Mäluplokkide kohta on tabelis järgmine info: * aadress ja maht; * iseloom - kinni, vaba, vabastatud (kui töötab ka “prahi koristamine”); * tunnused, näiteks kuuluvus mingisse klassi. 5.7. Paging. Füüsiline mälu jagatakse fikseeritud pikkusega freimideks (suurus on kahe aste: 512 ja 8192 baidi vahel). Loogiline mälupiirkond jagatakse lehekülgedeks, mille pikkus on freimiga võrdne. Protsessi leheküljed laetakse vabadesse freimidesse. Selleks et käivitada n lk-st koosnev programm, on vaja leida n vaba freimi, mis ei pea asuma järjest. 5.7.3 Kaitse Mälu kaitse lehekülgmälus korraldatakse lehekülgede tabeli kaudu. Igale freimile pannakse vastavusse lugemist ja kirjutamist lubav bitt. Teine bitt näitab, kas lehekülg kuulub protsessile (valid-invalid bit). 5.8 T.L.B. associative registers või translation look-aside buffers. TLB-s sisalduvad vaid mõned lehekülgede tabeli väärtused. Kui CPU genereerib uue aadressi, otsitakse lehekülje number TLB-st. Kui number leitakse, on freimi number olemas, kui aga mitte, pöördutakse mälus asuvasse lehekülgede tabelisse. Samal ajal paigutatakse ka uus väärtus TLB-sse. Kui TLB on täis, peab operatsioonisüsteem valima väärtuse, mida asendada.