Оболонка

За замовчуванням, Slackware завантажується у робочий рівень 3, тобто вас зустріне текстова консоль (аналогічно DOS у Віндовсі). Багатьох нових користувачів це відлякує. Навіть якщо вас це не налякало, читайте далі.

Користувачі

Вхід в систему

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

Welcome to Linux 2.4.18
Last login: Wed Jan   1 15:59:14 -0500 2005 on tty6.
darkstar login:

Так, це традиційне запрошення до реєстрації. Зверху вказано операційну систему і версію ядра, час останньої реєстрації і на якому терміналі вона відбулася. "darkstar" - це назва машини (hostname) що надається за замовчуванням у Slackware.

Якщо це перша реєстрація після інсталяції системи, вам потрібно буде ввійти як користувач root із відповідним гаслом, встановленим під час виконання setup.

Користувач root

Більшості користувачів Лінукс, надаються обмежені права у тому які програми вони можуть запускати, до яких файлів і каталогів матимуть доступ, тощо. Це робиться в першу чергу для захисту як цілої системи, так і одних користувачів від інших. Очевидно, що вам би не сподобалось, якби якийсь інший користувач знищив важливий документ, що знаходився у вашому домашньому каталозі, або деінсталював необхідну вам програму. Одночасно, для підтримки машини у робочому стані й управління тим самим обліком користувачів, необхідний користувач, який матиме доступ до всієї системи. Саме цю роль бере на себе root в Юніксах.

Саме так, root користується необмеженими правами щодо системи Лінукс. Йому, буквально, дозволено все. Будь-який файл може бути прочитано root-ом, видалено, любий процес зупинено або запущено, користувача скасовано або створено. Разом із цією вседозволеністю приходить і відповідальність. Досить легко розладнати систему з-за необережності, тому не варто використовувати цей рахунок без дійсної потреби.

Щоб стати користувачем root, виконайте команду ?su(1) (switch user); вам необхідно знати гасло root-користувача. Щоб повернутися назад до звичайного користувача, введіть команди exit або logout, або комбінацію клавіш Ctrl+D. root, в свою чергу, може ставати любим користувачем яким бажає, для цього потрібно виконати su - ім'я_користувача.

Командний рядок

Запуск програм

Програми - це теж просто файли, іноді бінарні, а іноді - ні. Як правило, програми розміщені у каталогах bin або sbin. Щоб запустити програму, ви можете надрукувати на командному рядку повний шлях до неї, скажімо /bin/su і притиснути клавішу Enter. Так само лише su теж спрацює:

$ /bin/su
Password:
# exit
$ su
Password:

Звідки оболонка знає, що це саме програма /bin/su, а не файл su у вашому домашньому каталозі, наприклад? Справа в тому, що оболонка має вбудований пошуковий механізм. Будь-які команди, вводені вами на командному рядку, будуть шукатися у каталогах, вказаних у спеціальній змінній середовища PATH. PATH може втримувати назви директорій, такі як /bin, /sbin, /usr/bin, /usr/X11R6/bin, тощо. Коли ви вводите команду, наприклад, xterm, оболонка шукає в цих каталогах файл із назвою "xterm" і якщо знаходить, його буде виконано. Так, в останньому прикладі буде виконано /usr/X11R6/bin/xterm. Звичайно, лише xterm набагато зручніше ніж друкувати повний шлях до програми.

Якщо програму не знайдено, або шлях до неї не перечислено у змінній PATH, ви отримаєте "Command not found" помилку. В останньому випадку варто або надрукувати повний шлях до команди, або змінити змінну PATH.

Запам'ятайте, що "." (крапка) позначає поточну директорію. Якщо, скажімо, ви знаходитесь у каталозі /bin, то можете вказати шлях до su просто як ./su, що означатиме "su в поточній директорії (./). Також крапка використовується якщо якась програма або скрипт знаходиться у тій самій директорії що й ви, незалежно від того чи цей каталог згадано у змінній PATH чи ні.

Байдужі знаки

Практично будь-яка оболонка включає деякі знаки, що є заміною або скороченням для знаків які вам необхідно надрукувати. Такі знаки називатимуться байдужими знаками, напевне тому, що під них можуть підпадати різні знаки. Вирази, що містять байдужі знаки також називаються шаблонами. Типовими байдужими знаками оболонок є * та ?. Я правило, ? співпадатиме із любим одинарним знаком (крім пробілу). Як приклад, скажімо ви знаходитесь у каталозі що містить ex1.txt, ex2.txt, ex3.txt файли і ви хочете скопіювати ці файли в інший каталог, скажімо /tmp за допомогою cp команди (описаної у Розділі 10.5.1). Ви можете надрукувати cp ex1.txt ex2.txt ex3.txt /tmp, але це дещо довго, набагато легше буде:

$ cp ex?.txt /tmp

Тобто ? співпадатиме із "1", "2", "3". Оболонка сама знайде всі три файла і заповнить відповідні значення замість ? байдужого знака.

Так, якщо ? співпаде лише з одним знаком, то * співпадатиме з любою кількістю любих знаків крім пробілу. Під виразом "люба кількість" мається на увазі також 0. Ту саму cp команду можна також розписати як:

$ cp ex* /tmp
$ cp * /tmp

і.т.п. Зауважте, що у випадку шаблонів (виразів з байдужими знаками) завжди є ризик що останній співпаде із тим що ми не мали на увазі. Так, скажімо ex* може співпасти із якимось іншим файлом який також починається з "ex" ("extra", "extension", "exploit", тощо), не згадуючи вже про те що * співпаде із назвою взагалі любого файла у поточному каталозі. Тож будьте обережними, наскільки "жадібні" складені вами шаблони.

Завжди можна перед вживанням небезпечних команд із шаблонами таких як rm, наприклад, спочатку перевірити із чим саме шаблон співпав з допомогою безпечніших echo або ls. У нашому випадку це могло би виглядати як

$ echo ex*

Для обмеження з чим саме шаблон співпадатиме, варто вживати вирази з [] або {} (квадратними або фігурними дужками). У випадку квадратних дужок, співпадання відбудеться лише із одним із знаків що внесено у квадратні дужки. Це легше пояснити на прикладі. Скажімо у вас є файли ex1.txt, ex2.txt, ex3.txt, exA.txt, exB.txt та exY.txt і вас цікавлять лише файли що включають цифри (1, 2, 3...), в такому випадку шаблоном буде:

$ ls ex[1-3].txt
ex1.txt ex2.txt ex3.txt
$ ls ex[1,2,3].txt
ex1.txt ex2.txt ex3.txt

У першому випадку ми вказали проміжок чисел від "1" до "3", тоді як у другому, ми просто перечислили їх. Це також працює з літерами, так щоб перечислити "ex" файли із літерою верхнього регістру, шаблоном буде ex[A-Z].txt ([a-z] - нижнього). Ви можете комбінувати те що знаходиться всередині шаблона, скажімо проміжки знаків і звичайне перечислення ([A-Z,2,3]).

Фігурні дужки дозволяю ще більший контроль над співпаданнями, оскільки надають можливість перечислювати можливі рядки співпадань:

$ ls e{xA,xB}.txt
exA.txt exB.txt

Ви знайдете додаткові деталі у bash(1) сторінці посібника у розділі "EXPANSION".

Перенаправлення вводу/виводу, конвеєри

Команди які ви виконуєте у Лінуксі часто виводять повідомлення на екран. Це може бути звичайний вивід команди, може бути повідомлення про помилку. Іноді, навпаки, команда може очікувати вводу або з файла, якщо ні, то просто з клавіатури. Наступні приклади демонструють ці випадки:

$ whatis ps
ps                   (1)  - report process status
$ pc
-bash: pc: command not found
$ cat /etc/resolv.conf
nameserver 192.168.1.254
$ cat

У першому випадку ми отримали нормальний вивід whatis(1) команди з ps аргументом. У другому - вивід про помилку що pc команди не існує. У третьому, знову ж таки - нормальний вивід cat команди, тоді як в останньому прикладі та сама cat очікуватиме будь-якого вводу, оскільки не отримала жодного. Ми можемо у випадку останньої cat надати ввід з клавіатури, коли закінчимо друкувати, притиснути Ctrl+D, що буде сигналом оболонці що ввід закінчився.

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

$ ps -ax > processes.txt

перенаправить вивід ps -ax команди у файл processes.txt (використайте less або more щоб переглянути останній).

Якщо ми виконаємо якусь нову команду і перенаправимо з допомогою ">" її вивід у той самий processes.txt, останній буде переписано заново, текст нашого першого перенаправлення буде знищено. Саме тому треба обережно ставитись до ">" оператора перенаправлення. У випадку якщо вам хочеться добавити новий текст до файла, не знищуючи його зміст, варто використовувати подвійний оператор перенаправлення ">>":

$ date >> processes.txt

Останнє добавить вивід date(1) команди до існуючого тексту у processes.txt.

Це що стосується виводу. Щодо вводу, ви, напевне здогадались, що оператором перенаправлення вводу буде "<". Ту саму cat команду, або fromdos(1) (трансформує Віндовс/DOS файли у Юнікс), можна розписати як:

$ cat < /etc/resolv.conf 
$ fromdos < dosfile.txt > unixfile.txt

Як правило, ми не повинні весь вживати оператор перенаправлення вводу "<", більшість Лінукс команд розуміють що якщо оператора вводу немає, ввід буде поступати з файлів, назви яких надані як аргумент команди або з клавіатури.

Тепер, щодо однієї із найцікавіших рис оболонки - конвеєрів. Конвеєри дозволяють перенаправити вивід однієї команди у ввід іншої. Це звільняє нас від необхідності зберігати вивід першої команди у файл, а потім використовувати цей файл як ввід для другої команди (а потім усувати цей файл, якщо він нам не потрібний). Тобто вивід першої команди як потік байтів передається безпосередньо іншій команді. Символом конвеєра традиційно є вертикальна риска "|" (англійською pipe). Ось декілька прикладів:

$ ls -la ~ | less
$ ps aux | grep "bash" | more
$ dmesg | less
$ cat /proc/pci | grep -A 4 "Ethernet" >> ethernet.txt

Як ви бачите, конвеєри дозволяють складати різноманітні команди у складніші конструкції. Вивід передається по черзі від однієї команди до наступної і обробляється кожною з них. Таке комбінування команд виявляється надзвичайно зручним, дозволяючи об'єднаним простішим програмам виконувати складні функції.

Оболонка Bash

Змінні середовища

Лінукс є доволі складною системою із багатьма речами що повинні бути узгодженими між програмами, такими як, скажімо тип термінала, назва хоста, мова і кодування що використовується, тощо. Для таких узагальнених речей було винайдено те що називається середовищем. Середовище визначає умови у яких програми запускаються. Середовище, як правило, встановлюється за допомогою змінних середовища оболонки і тому можна легко змінювати. Багато програм під час запуску перевіряють значення змінних середовища, так мова інтерфейсу багатьох залежить від значень LANG та LC змінних, якщо програма запускатиме інші програми, їй необхідно буде взнати значення PATH змінної, деякі програми вимагають встановленої VISUAL, NNTPSERVER змінних, і.т.д.

За допомогою команди set (описаної у bash(1) сторінці посібника) можна взнати всі встановлені змінні середовища:

$ set
PATH=/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin
PIPESTATUS=([0]="0")
PPID=4978
PS1='\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/home/logan
QTDIR=/usr/local/lib/qt
REMOTEHOST=ninja.tdn
SHELL=/bin/bash     
...

Команда unset скасує якусь змінну середовища якщо необхідно, "скасує" означає що змінної навіть не існуватиме:

$ unset REMOTEHOST

Щоб встановити якусь нову змінну середовища, нам необхідно використати export команду:

$ export EDITOR=/usr/bin/vim
$ export PATH=$PATH:~/bin

Остання команда встановить EDITOR змінну і добавить ще один каталог до PATH змінної (~/bin) тільки для теперішнього сеансу оболонки. Для того щоб ці зміни зберегти назавжди у нашому середовищі, нам необхідно добавити ці команди до .bashrc файла у нашому домашньому каталозі.

Щоб перевірити значення однієї з змінних можете використати echo команду. Зауважте, що коли ми надаємо значення змінній, як у прикладі з export вище, ми використовуємо лише її назву, тоді як для отримання значення ми повинні добавити знак долару ($) попереду назви змінної:

$ echo $PATH
/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin

Tab-доповнення

Bash має одну дуже гарну рису. Для того щоб запобігти друкуванню довгих команд або назв файлів, існує механізм таб доповнення. Тобто ви завжди можете ввести перші декілька літер команди або назви файла і притиснути Tab клавішу, що виповнить назву команди або файла, або, принаймні видасть можливі варіанти виповнення у випадку багатьох можливих варіантів (в останньому випадку необхідно два рази клацнути Tab). Це дійсно зручно. Скажімо, ви забули назву команди, лише пам'ятаєте що вона починається з літери "z":

$ z<Tab><Tab>
zcat        zdump       zfgrep      zic         zipgrep     zipsplit    zmore                   zsoelim     
zcmp        zegrep      zforce      zip         zipinfo     ziptool     znew        
zdiff       zeisstopnm  zgrep       zipcloak    zipnote     zless       zoo

$ ls /bin/s<Tab><Tab>
setterm  sh       shred    sleep    sln      stty     su       sulogin  sync 

( - мається на увазі притиснути клавішу Tab.)

Так само, друкуючи назви шляхів, можете ввести одну або декілька літер і притиснути Tab один раз для автоматичного виповнення, або два рази для можливих варіантів.

Віртуальні термінали

Якщо у X графічному режимі ми можемо відкривати багато вікон терміналів (xterm, gterm, тощо), то у текстовому режимі нам також надаються додаткові віртуальні термінали oкрім основного tty1.

Щоб перемкнутися на інший віртуальний термінал, вам необхідно притиснути ліву Alt разом із функціональними клавішами F1, F2, F3 ... аж до F6. За замовчуванням Slackware надає реєстрацію на шістьох віртульних терміналах (перечислених у /etc/inittab), так Alt+F2 перенесе вас на другий термінал, Alt+F3 - на третій і.т.д.

Ключі F7 і вище зарезервовані для X сесій. Кожний X сеанс використовує власний віртуальний термінал, починаючи з сьомого (Alt+F7, tty7) і вище. Якщо ви знаходитесь у X графічному середовищі, вам необхідно вживати додатковий Ctrl ключ щоб перемкнутися на інший термінал (текстовий режим), не вбиваючи X сесію, наприклад Ctrl+Alt+F2. Щоб повернутися назад у X (tty7), притисніть Alt+F7.

Screen

Окрім віртуальних терміналів ми також маємо керівник екраном під назвою ?screen(1). Це програма що емулює віртуальні термінали без потреби, власне, додаткових терміналів. Тобто, ми можемо знаходитись лише на tty1 і всерівно мати нові екрани терміналів завдяки screen команді. На відміну від віртуальних терміналів, screen має власні команди що починаються з Ctrl+A префіксу. Так, наприклад, Ctrl+A+C створить нову термінальну сесію, Ctrl+A+N переключить нас до наступного терміналу, Ctrl+A+P - до попереднього.

screen також підтримує від'єднання і приєднання назад до screen сесії, це особливо зручно для віддалених ssh(1) або ?telnet(1) сеансів. Ctrl+A+D відокремить вас від поточної сесії screen. Команда screen -r перечислить всі поточні сесії до яких ви можете приєднатися:

$ screen -r
There are several suitable screens on:
    1212.pts-1.redtail      (Detached)
    1195.pts-1.redtail      (Detached)
    1225.pts-1.redtail      (Detached)
    17146.pts-1.sanctuary   (Dead ???)
Remove dead screens with 'screen -wipe'.
Type "screen [-d] -r [pid.]tty.host" to resume one of them. 

Якщо виконати screen -r 1212, це приєднає нас до першої сесії зі списку. Ви можете приєднатися до screen сесії навіть після того як ssh з'єднання було розірвано.

Проконсультуйте ?screen(1) сторінку посібника для додаткових деталей по цій програмі.