четвер, 9 січня 2014 р.

Комбінації клавіш bash

Ctrl + a — перехід на початок рядка;

Ctrl + c — посилає програмі SIGINT. Зазвичай, перериває поточне завдання;

Ctrl + d — видаляє символ під курсором (аналог delete);

Ctrl + e — перехід до кінця рядка;

Ctrl + k — видаляє все, до кінця рядка (EOL, а не на екрані!);

Ctrl + l — очищає екран (аналог clear);

Ctrl + r — пошук по історії. Повторення пошуку (листання результатів пошуку). Тобто інкрементальний пошук;

Ctrl + j — припиняє пошук і дозволяє відредагувати знайдену команду. Якщо пошук не проводився, то аналогічно натиснення return;

Ctrl + t — міняє символ під курсором на попередній. Або, якщо хочете , тягне попередній символ до кінця рядка;

Ctrl + u — видаляє всі символи зліва від курсора до початку рядка;

Ctrl + w — видаляє символи ліворуч від курсору до початку слова;

Ctrl + xx — переходить від поточної позиції курсора на початок рядка і назад;

Ctrl + z — suspend-ить поточну задачу (csh, zsh);

Ctrl + e — відкриває $EDITOR для зміни введеного рядка. Після збереження змін, команда відправляється на виконання. Якщо змінна не задана, то відкривається системний текстовий редактор.

четвер, 21 березня 2013 р.

Введення в bash

Перевірити чи запущено bash можна наступною командою:
$ echo $SHELL
/bin/bash

Використання команди «cd»:
$ cd /
Цією командою ми вказали bash що хочемо переміститися в кореневу директорію — /. Всі директорії в системі організовані в деревоподібну структуру і / це її початок (або корінь). Команда cd служить для зміни поточної робочої директорії.

Щоб довідатися в якому місці файлової системи в даний момент ви знаходитесь (поточну робочу директорію) наберіть:
$ pwd
/
В даному випадку / — абсолютний шлях, це означає що шлях зазначений відносно кореневої директорії.

Кілька прикладів абсолютних шляхів:
/dev
/usr
/usr/bin
/usr/local/bin
Вказуючи шлях /usr/local/bin в якості аргументу команді cd ми говоримо їй перейти в кореневу директорію /, потім в директорію usr, потім у local і bin. Абсолютні шляхи завжди починаються з /.

Відносні шляхи можуть містити одну або декілька директорій «..».
$ pwd
/usr/local/bin
$ cd ..
$ pwd
/usr/local

Можна додати «..» до відносного шляху. Це дозволить переміститись в директорію, яка знаходиться на одному рівні з тією в якій ми знаходимося:
$ pwd
/usr/local
$ cd ../share
$ pwd
/usr/share

Відносні шляхи можуть бути досить складними. Ось кілька прикладів:
$ cd /bin
$ cd ../usr/share/zoneinfo

$ cd /usr/X11R6/bin
$ cd ../lib/X11

$ cd /usr/bin
$ cd ../bin/../bin

Існує ще одна спеціальна директорія «.», яка вказує на поточну директорію. Ця директорія використовується для запуску файлів, що виконуються та знаходяться у поточній директорії:
$ ./myprog

Для того щоб перейти в домашню директорію, потрібно набрати:
$ cd
Без аргументу cd перемістить вас в домашню директорію. Для суперкористувача домашньою зазвичай є директорія /root, а для звичайних користувачів — /home/username/. Але що якщо ми хочемо вказати конкретний файл, що знаходиться в домашній директорії, наприклад, як аргумент до програми «myprog» можна написати:
$ ./myprog /home/user/myfile.txt
Однак, використовувати абсолютні шляхи до файлів не завжди зручно. Цю ж операцію можна зробити за допомогою «~» — тільди:
$ ./myprog ~/myfile.txt
«~» — Спеціальне ім'я, яке вказує в bash на домашню директорію користувача.

Але що якщо нам потрібно вказати файл в домашній директорії іншого користувача? Для цього після тільди потрібно вказати ім'я цього користувача. Наприклад, щоб вказати на файл fredsfile.txt що знаходиться в домашній директорії користувача fred:
$ ./myprog ~fred/fredsfile.txt

Команда ls, без аргументів, виводить на екран список файлів що зберігаються в робочій директорії:
$ cd /usr
$ ls
X11R6 doc i686-pc-linux-gnu lib man sbin ssl
bin gentoo-x86 include libexec portage share tmp
distfiles i686-linux info local portage.old src
Якщо вказати опцію -a, можна буде побачити всі файли, включаючи приховані (імена яких починаються з крапки).
$ ls -a
. bin gentoo-x86 include libexec portage share tmp
.. distfiles i686-linux info local portage.old src
X11R6 doc i686-pc-linux-gnu lib man sbin ssl

Після самої команди ls в якості її аргументу можна вказати один або більше файлів або директорій. Якщо вказати ім'я файлу, то команда ls виведе інформацію тільки про цей файл. А якщо вказати назву директорії, ls покаже весь її вміст. Опція «-l» команди ls буває дуже корисною якщо ви хочете окрім імен файлів дізнатися більш детальну інформацію про них (права на файл, ім'я власника, час останньої зміни файлу і його розмір).
$ ls -l /usr
drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6
drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin
drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles
lrwxrwxrwx 1 root root 9 Dec 22 20:57 doc -> share/doc
drwxr-xr-x 62 root root 1856 Dec 27 15:54 gentoo-x86
drwxr-xr-x 4 root root 152 Dec 12 23:10 i686-linux
drwxr-xr-x 4 root root 96 Nov 24 13:17 i686-pc-linux-gnu
drwxr-xr-x 54 root root 5992 Dec 24 22:30 include
lrwxrwxrwx 1 root root 10 Dec 22 20:57 info -> share/info
drwxr-xr-x 28 root root 13552 Dec 26 00:31 lib
drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec
drwxr-xr-x 8 root root 240 Dec 22 20:57 local
lrwxrwxrwx 1 root root 9 Dec 22 20:57 man -> share/man
lrwxrwxrwx 1 root root 11 Dec 8 07:59 portage -> gentoo-x86/
drwxr-xr-x 60 root root 1864 Dec 8 07:55 portage.old
drwxr-xr-x 3 root root 3096 Dec 22 20:57 sbin
drwxr-xr-x 46 root root 1144 Dec 24 15:32 share
drwxr-xr-x 8 root root 328 Dec 26 00:07 src
drwxr-xr-x 6 root root 176 Nov 24 14:25 ssl
lrwxrwxrwx 1 root root 10 Dec 22 20:57 tmp -> ../var/
У першій колонці показана інформація про права доступу до кожного файлу в списку. Друга колонка показує кількість посилань на кожен елемент списку. Третя і четверта колонки — власник і група відповідно. П'ята колонка — розмір. Шоста — час останньої зміни файлу. Остання колонка — ім'я файлу або директорії (якщо це посилання, то після знаку «->» стоїть ім'я об'єкта на який вона посилається).

Іноді виникає потреба подивитися інформацію тільки про директорії. З цим завданням допоможе впоратися опція «-d», яка вказує команді виводити інформацію тільки про директорії.
$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share
drwxr-xr-x 4 root root 96 Dec 18 18:17 ../share
drwxr-xr-x 17 root root 576 Dec 24 09:03 /usr
drwxr-xr-x 2 root root 3192 Dec 26 12:52 /usr/X11R6/bin
drwxr-xr-x 2 root root 14576 Dec 27 08:56 /usr/bin

Дія опції «-R» протилежна дії «-d». Вона дозволяє виводити інформацію про файли, що знаходяться в директорії рекурсивно. Спочатку показується вміст директорії верхнього рівня, потім по черзі вміст всіх піддиректорій і так далі.

Опція «-i» використовується для виведення інодів кожного об'єкта файлової системи.
$ ls -i /usr
1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin
1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share
8316 distfiles 1517 include 776 man 23779 src
43 doc 1386 info 93892 portage 36737 ssl
70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp

Кожен об'єкт файлової системи (файл, директорія...) має свій унікальний номер — інод (inode number). Ця інформація може здатися незначною, але розуміння цього допоможе вам розібратися у багатьох операціях над файловою системою. Наприклад, подивимося на «.» і «..» як на посилання, присутні в кожній директорії. Щоб зрозуміти що собою являє директорія «..», дізнаємося інод директорії /use/local:
$ ls -id /usr/local
5120 /usr/local
Як бачимо, інод директорії /usr/local — 5120. Тепер подивимося який інод у директорії /usr/local/bin/..:
$ ls -id /usr/local/bin/..
5120 /usr/local/bin/..
Виходить, що іноди директорій /usr/local і /usr/local/bin/.. збігаються. Це означає, що на інод 5120 посилаються два імені: /usr/local і /usr/local/bin/.. Тобто це два різних імені однієї директорії. Кожен інод вказує на певне місце на диску.

З кожним інодом може бути пов'язано декілька імен об'єктів файлової системи. Кількість «синонімів» файлу (об'єктів файлової системи, що посилаються на один інод) показує число у другому стовпці виводу команди «ls -l»:
$ ls -dl /usr/local
drwxr-xr-x 8 root root 240 Dec 22 20:57 /usr/local
На цьому прикладі видно (другий стовпець), що на директорію /usr/local посилаються 8 різних об'єктів файлової системи:
/usr/local
/usr/local/.
/usr/local/bin/..
/usr/local/games/..
/usr/local/lib/..
/usr/local/sbin/..
/usr/local/share/..
/usr/local/src/..

Команда mkdir служить для створення нових директорій. У прикладі демонструється створення трьох нових директорій (tic, tac, toe) в директорії /tmp:
$ cd /tmp
$ mkdir tic tac toe

За замовчуванням команда mkdir не може створювати вкладеної структури директорій. Тому, якщо вам потрібно створити декілька вкладених одна в іншу директорій (won/der/ful), то вам доведеться три рази по черзі викликати цю команду:
$ mkdir won/der/ful
mkdir: cannot create directory 'won/der/ful': No such file or directory
$ mkdir won
$ mkdir won/der
$ mkdir won/der/ful

Спростити цю операцію можна додавши опцію «-p» до команди mkdir. Ця опція дозволяє створювати вкладену структуру директорій:
$ mkdir -p easy/as/pie
Щоб дізнатися про можливості цієї утиліти докладніше, прочитайте довідку, яка викликається командою man mkdir. Довідки є практично до всіх команд з цього керівництва (наприклад man ls), крім cd, тому вона вбудована в bash (для таких команд довідка викликається так: help cd).

Команда touch оновлює час останнього доступу до файлу (шоста колонка виводу команди ls -l) якщо він вже існує або створює новий порожній файл, якщо його ще немає. Після цієї операції у нас має з'явитися порожній файл /tmp/copyme:
$ cd /tmp
$ touch copyme

Тепер, коли у нас є порожній файл, запишемо текстову рядок за допомогою команди echo, яка виводить переданий їй аргумент на стандартний пристрій виводу (текстовий термінал в нашому випадку):
$ echo "firstfile"
firstfile

Щоб записати рядок в наш файл, перенаправимо в нього виведення команди echo:
$ echo "firstfile" > copyme
Знак «>» (більше) вказує командній оболонці що потрібно перенаправити виведення команди у файл, ім'я якого знаходиться справа. Якщо файлу з таким ім'ям не існує, він буде створений автоматично. А якщо такий файл вже є, то він буде перезаписаний (весь його вміст буде стерто перед записом нашого рядка). Команда «ls -l» покаже що розмір нашого файлу тепер дорівнює десяти байтам — дев'ять байт займає слово «firstfile» і один байт символ переведення рядка.

Для виведення вмісту файлу на термінал використовується команда cat:
$ cat copyme
firstfile

Команда cp приймає два аргументи. Перший — ім'я вже існуючого файлу «copyme», другий — назва нової копії, яку ми хочемо зробити «copiedme»:
$ cp copyme copiedme

Команда mv перейменовує файл («copiedme» -> «movedme»). Номер інода після цієї операції не змінюється, а змінюється тільки назва файлу.
$ mv copiedme movedme
Номер інода не змінюється лише за умови, що перейменований файл залишається в межах тієї файлової системи де знаходився початковий файл.

Команда mv дозволяє не тільки перейменовувати файли, але і переміщати їх. Наприклад, щоб перемістити файл /var/tmp/myfile.txt в директорію /home/user потрібно дати команду:
$ mv /var/tmp/myfile.txt /home/user

Щоб перемістити одночасно кілька файлів в одну директорію потрібно написати:
$ mv /var/tmp/myfile1.txt /var/tmp/myfile2.txt /home/user
або
$ mv -t /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt

Якщо додати опцію «-v», на екран буде виведено звіт про виконану операцію:
$ mv -vt /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt
'/var/tmp/myfile1.txt' -> '/home/user/myfile1.txt'
'/var/tmp/myfile2.txt' -> '/home/user/myfile2.txt'

Видалення проводиться за допомогою команди rm. Щоб видалити декілька файлів, просто вкажіть їх імена через пробіл в командному рядку як аргументи rm:
$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root 0 Jan 1 16:41 file1
-rw-r--r-- 1 root root 0 Jan 1 16:41 file2
$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory ls: file2: No such file or directory

Видалені файли неможливо відновити. Тому багато початківців використовують опцію «-i» команди rm, яка вимагає запитувати у користувача підтвердження видалення кожного файлу.
$ rm -i file1 file2
rm: remove regular empty file `file1'? y
rm: remove regular empty file `file2'? y

Є два способи видалення директорій: можна по черзі видалити весь вміст директорії, а потім використати команду rmdir для видалення самої директорії:
$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir
Але, зручніше використовувати команду «rm -rf» для видалення директорії з усім її вмістом:
$ rm -rf mydir

Синтаксис шаблону: * і?

* Відповідає нулю або більшій кількості символів:
  • /etc/g* — всі файли в директорії /etc/ імена яких починаються з «g» і файл з ім'ям «g».
  • /tmp/my*1 — всі файли в директорії /tmp імена яких починаються з «my» і закінчуються на «1» (включаючи файл з ім'ям «my1»)
? замінює один будь-який символ:
  • myfile? — будь-який файл чиє ім'я починається зі слова «myfile» за яким слідує один будь-який символ.
  • /tmp/notes?txt — відповідає файлам з іменами «notes.txt» і «notes_txt» (якщо вони існують в /tmp/).

Квадратні дужки: []

Шаблон «[]» дуже схожий на «?» але дозволяє явно вказувати набір символів. Шаблон «[]» збігається з одним символом з тих що вказані в дужках. Також у дужках можна вказати діапазон символів (для цього використовується символ -/дефіс) або кілька діапазонів поспіль, тоді шаблон буде збігатися з одним будь-яким символом з цього діапазону:

  • myfile[12] — відповідає myfile1 і myfile2. Шаблон буде працювати поки існує хоча б один з цих двох файлів.
  • [Cc]hange[Ll]og — відповідає файлам з іменами Changelog, ChangeLog, changeLog, і changelog. Як ви могли помітити, використання шаблону «[]» корисно при пошуку імен що відрізняються регістром літер.
  • ls/etc/[0-9]* — вивести список файлів в директорії /etc/ імена яких починаються з цифри.
  • ls/tmp/[A-Za-z]* — вивести список файлів в директорії /tmp/ імена яких починаються з літери (великої чи прописної).

Конструкція «[!]» схожа на «[]», за винятком того що вона відповідає одиничному символу, не згаданому між «[! і ]». наприклад:
  • rm myfile[!9] — видалить всі файли, імена яких складаються з слова «myfile» і однією цифрою, крім файлу «myfile9».