Командна оболонка в UNIX. Про різні командні оболонки Linux і Unix

Анотація: Концепція командної оболонки. Огляд командних оболонок. Командна оболонка bash. Особливості роботи (історія команд, оператор "!", дії натискання клавіші ). Багатозадачність у консолі. Завдання. Управління завданнями. Змінні середовища Midnight commander

Хід заняття

1. У світі Linux та Unix робота на комп'ютері нерозривно пов'язана з поняттям командна оболонка (shell)- Програма , що дозволяє користувачеві взаємодіяти з системою за допомогою введення та виконання команд. Проте, командна оболонкає звичайною програмою. Довести це можна, встановивши як оболонку за умовчанням у файлі passwdдля користувача іншу програму. Але для того, щоб система знала її як оболонку, необхідно додати абсолютне ім'я файлу /etc/shells.

У складі Linux йде кілька командних оболонок, їх склад може змінюватись в залежності від дистрибутива, але завжди ви зможете виявити:

Bourne Shell (sh) – найстаріша та найпоширеніша командна оболонкадля Unix-систем. Немає жодної системи Unix, де б вона не застосовувалася.

Bourne Again Shell (bash) - розширена Bourne Shell. Має масу приємних переваг, тому стала так популярна останнім часом. Є оболонкою "за умовчанням" практично всім дистрибутивів Linux.

Також популярними оболонками є:

csh- Оболонка, система команд якої близька до мови програмування C

tcsh - Оболонка, система команд якої близька до мови програмування Tcl.

zsh - оболонка, що має, напевно, найширші можливості. Є розширенням sh (bourne shell).

Оскільки в Linux "за умовчанням" використовується bash, то про неї ми й поговоримо.

2. Командна оболонка bash спочатку була вільно-розповсюджуваним аналогом Bourne Shell. Згодом, коли її можливості зросли, тоді її почали вважати самостійним продуктом. Основними можливостями bash можна назвати такі:

Таблиця 1.1.
Можливість Коментар
1 Редагування рядка Можливість відредагувати введену команду замість того, щоб її переписувати заново
2 Організація каналів Можливість перенаправлення введення-виведенняорганізації каналів між виконуваними завданнями
3 Зручність у роботі Використання псевдонімів команд, історії команд, автодоповнення
4 Управління завданнями Можливість створення фонових завдань та управління ними
5 Гнучкість налаштування Використання файлів-сценаріїв для входу для кожного користувача окремо, змінні середовища

З перенаправленням введення-виведення та каналами ми познайомимося пізніше, на 8-му занятті. Тож цей пункт ми опустимо. А ось про особливості роботи в bash, про переваги, що їм надаються, поговоримо докладніше.

Bash автоматично записує всі команди, набрані користувачем файлу ~/.bash_history. Для керування цим файлом є команда history. history - це вбудована команда bash. Тобто виконуваного файлу, що відповідає цій команді, не існує. Сама командна оболонкавиконує усі дії. Введена без параметрів, вона просто виводить список усіх команд, збережених у цьому файлі, і ідентична команді cat ~/.bash_history .

Історія команд існує для спрощення набору часто використовуваних команд. Історію команд можна перебирати за списком клавішами <вверх>і<вниз> .

Інший спосіб - набрати в командному рядку! та початок команди та натиснути . Остання команда з історії, перші літери якої збігаються із набраними, буде виконана. Наприклад:

$ !/usr /usr/bin/perl ./ptest.pl OK $ !xfonts bash: !xfonts: event not found $

Але як прискорити уведення, якщо в історії ще немає необхідної нам команди? В цьому випадку нам допоможе клавіша . Набравши кілька перших букв команди (або шляхи до файлу), натисніть і Bashавтоматично доповнить вашу команду (або шлях). У випадку, коли підходять кілька файлів або жоден файл не підходить, система видасть звуковий сигнал. Якщо кнопку натиснути повторно, коли підходить кілька файлів – система виведе список , а коли жодного – повторить звуковий сигнал

3. З першого заняття ви повинні пам'ятати, що Linux - багатозадачне середовище. Однак, до цього часу Ви ще так і не змогли скористатися його багатозадачністю. На перший погляд здається, що консоль не дозволяє використовувати можливості багатозадачності системи, і тільки в графічному середовищі можна одночасно запустити дві або більше програми. Але це не так! Консоль також багатозадачна.

По-перше, ви можете відкрити кілька консолей, відкривши в кожній із них за програмою. Перемикання між консолями буде здійснюватися за допомогою клавіш Ctrl+ , де x- Номер консолі.

І навіть в одній консолі за допомогою команд керування завданнями Ви можете повністю використовувати всі переваги багатозадачної системи.

– комбінація клавіш, що посилає процесу неперехоплюваний сигнал sigstop. Дозволяє зупинити виконання процесу передачі управління командному рядку.

команда & – символ & після команди дозволяє запустити її у фоновому режимі.

jobs - виводить список поточних завдань командного інтерпретатора.

bg<#j>- Переводить завдання #j у фоновий режим . Перед цим завдання має бути зупинено комбінацією клавіш . Якщо на даний момент інтерпретатор має лише одне завдання, то номер можна не вказувати.

fg<#j>- Переводить завдання #j в режим виконання на передньому плані. Завдання має бути зупинено комбінацією клавіш або у фоновому режимі. Якщо на даний момент інтерпретатор має лише одне завдання, то номер можна не вказувати.

$ man bash ^ Z + Stopped man bash $ vim ^ Z vim + Stopped vim $ bg 1 + man bash & $ jobs + Stopped man bash + Stopped vim $ fg 2 + vim $ fg + man bash $

4. Змінні середовища– системна інформація , що вказує на Ваші уподобання, такі як текстовий редакторза умовчанням, шляхи пошуку виконуваних файлів тощо, а також ідентифікаційні дані користувача, системи та командної оболонки, такі як Ім'я користувача, версія Linux та інше, що використовується командним інтерпретатором та іншими програмами.

Часто використовувані користувачем змінні:

PATH – змінна містить шляхи, в яких системі слід шукати файли, що виконуються, якщо в командному рядку не набирається повний або відносний шляхдо них.

PWD – змінна містить повне ім'я директорії.

HOME – змінна містить повний шлях домашнього каталогу користувача.

HOSTNAME – змінна містить ім'я комп'ютера.

LOGNAME – містить Ім'я користувача

SHELL містить ім'я командної оболонки, запущеної в поточному сеансі.

USER - містить Ім'я користувача, сеанс якого відкрито зараз.

Список змінних, встановлених у системі, можна побачити за допомогою команди export , введеної без параметрів.

Командний інтерпретатор bash має свої змінні. Щоб локальні змінні стали системними, їх необхідно експортувати за допомогою тієї ж команди export .Наприклад:

$ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="uk_UA.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin: /usr/bin:/usr/local/bin:/home/gserg/bin" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $ EDITOR=/bin/vim $ export EDITOR $ export declare -x EDITOR="/bin/vim" declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="uk_UA.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare - x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $

Команда unsetвидаляє системну змінну. Наприклад:

$ unset EDITOR $ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="uk_UA.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH=" /bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM= "Eterm" declare -x USER="gserg" $

5. На сьогоднішньому занятті ми познайомимося з вами з ще однією, трохи нестандартною, командною оболонкою Midnight commander. Це не командна оболонкау звичайному розумінні. Це текстовий файловий менеджер – аналог Norton Commanderабо Far. Midnight commanderзапускається командою mc. Ми поговоримо про його можливості.

Екран Midnight commander"аподілено на дві частини. Практично весь простір екрану займає дві панелі зі списком каталогів та файлів. За замовчуванням, друга знизу екрана лінія являє собою командний рядок, в якому Ви можете виконувати звичайні команди оболонки, а на нижній лінії зображені підказки для функціональних клавіш ( F1-F10). Верхня лінія символів містить меню , за допомогою якого можливе виконання багатьох функцій. Для використання меню Ви можете натиснути мишею в потрібний пункт або натиснути клавішу F9та за допомогою клавіш управління курсоромвибрати потрібний пункт.

Панелі Midnight commanderзабезпечують перегляд одночасно двох каталогів. Одна з панелей є активною (у тому сенсі, що користувач може виконувати ті чи інші дії з файлами і каталогами, що знаходяться в ній). В активній панелі підсвічено ім'я одного з файлів або каталогу, а також виділено заголовок панелі у верхньому рядку. Ім'я заголовка збігається з назвою каталогу, що відображається на даний момент. Майже всі операції виконуються на активній панелі. Деякі операції, такі як перенесення або копіювання файліввикористовують пасивну панель як місце, куди проводиться копіювання, перенесення і т.д.

Тепер поговоримо про основні поєднання клавіш, які допоможуть Вам працювати з Midnight commander"ом.

для зміни активної панелі застосовуються клавіші або +

для того, щоб відзначити файл , натисніть або +

натисніть для отримання довідки

викличе переглядач файлів

за допомогою ви відредагуєте файл

дозволить Вам скопіювати файл.

перенести або перейменувати файл

створити каталог

Клавіша дозволить видалити файл та/або каталог

, як говорилося, відкриває доступом до меню .

- дозволить вийти з Midnight commander.

переведе покажчик на початок списку файлів,

- Навпаки - в кінець списку.

і змінять положення показника на сторінку вгору та вниз відповідно.

Клавіша <*> на додатковій клавіатурі дозволить інвертувати виділення файлів (вона не діє на каталоги)

Клавіша <+> на додатковій клавіатурі дозволить відзначити файли по масці, а <-> зняти позначку із файлів по масці.

+ - оновити зміст директорії (перечитавши з диска чи мережі)

+ - поміняти місцями праву та ліву панелі.

+ - прибрати/повернути панелі.

Хоча поєднання швидких клавіш є оптимальним інструментом для того, щоб зробити роботу з Midnight commander"оммаксимально швидкою та зручною, новачкам досить важко вивчити їх відразу все. Щоб заповнити цю прогалину та додати інші можливості, для яких відсутні комбінації клавіш, Midnight commanderмає меню (викликається по F9).

Меню складається із пунктів: "Ліва панель", "Файл", "Команда", "Параметри", "Права панель".

"Ліва/права панель"- Ці пункти меню абсолютно однакові. Відмінності між ними полягають тільки в тому, що дії, що виконуються, будуть адресовані в ліву або праву панель.

"Формат списку"- відкриває діалогове вікно , у якому можна вибрати вид, у якому відображатиметься список файлів/каталогів. На вибір пропонується стандартний, укорочений та розширений формати. Однак користувач у цьому вікні може і сам визначити вид панелі таким, який його влаштовуватиме, вибравши перемикачем "Визначений користувачем".

"Швидкий перегляд"- Переводить панель у режим автоматичного перегляду файлів, що вибираються на сусідній панелі. Фокус автоматично перемикається на протилежну панель.

"Інформація"- переводить панель у режим перегляду інформації про файл, підсвічений у сусідній панелі, такий як положення, права доступу та власник, файлова системаі пристрій, на якому він розташований, кількості жорстких посилань, пов'язаних з цим файлом, а також інформації про пристрій, на якому розташований файл

"Дерево"- перекладає Midnight commanderу режим, схожий на режим провідника з OC Windows . У панелі, до якої застосовано команду "Дерево", будується дерево каталогів, яким можна переміщатися за допомогою стрілок управління курсором, клавіш PageUp, PageDown, Home, End. У сусідній панелі висвічується вміст каталогу, що підсвічується в дереві.

"Порядок сортування"- відкриває діалогове вікно , в якому ви можете вибрати атрибут , за яким буде проводитися сортування файлів і каталогів у списку з таких як ім'я, розширення, час редагування, час доступу , час зміни атрибутів, розмір, вузол (на якому розташований файл ). Також можна залишити файли без сортування, сортувати з урахуванням регістру або у зворотному порядку.

"Фільтр"- дозволяє вибрати імена файлів, які будуть відображатися на панелі за допомогою регулярного виразу, введеного в діалоговому вікні.

"FTP-з'єднання"- за допомогою цієї команди Ви можете встановити з'єднання з віддаленим (або навіть локальним) комп'ютером за протоколом ftp. Якщо введено лише адресу віддаленого сервера, то Midnight commanderспробує встановити анонімне з'єднання. Повний рядок, за допомогою якого задається вузол такий:

ftp:ім'я_користувача:пароль@адреса_сервера:порт/каталог_на_сервері

Після встановлення з'єднання, робота з віддаленою файловою системоювідбувається аналогічно до роботи з локальною ФС.

"Shell-з'єднання"- дозволяє відкрити мережеве з'єднання за протоколом FISH (FIle transfer over SHell- Передача файлів за допомогою оболонки). FISHвикористовує протоколи RSH (Remote SHell- віддалена оболонка ) або SSH (Secure SHell– захищена оболонка, аналог RSH, але за допомогою шифрування переданих даних). Повний рядок, за допомогою якого користувач може задати віддалений вузол такий:

sh:ім'я_користувача@адреса_сервера:опції/каталог_на_сервері

Параметр Ім'я користувача, опції та каталог_на_серверіне є обов'язковими. Якщо Ім'я користувачане вказано, то Midnight commanderнамагатиметься зареєструватися на віддаленій системі з ім'ям користувача, що використовується на локальному комп'ютері.

"Переглянути"- аналог комбінації клавіш + - Викликає оновлення списку файлів і каталогів у поточній панелі, перечитавши їх з диска або мережі.

"Файл"- розділ меню, пункти якого забезпечують основні функції обробки файлів та каталогів, такі як:

"Меню користувача"- дозволяє викликати меню, яке встановлює сам користувач. Також викликається клавішею .

"Перегляд файлу"- аналог функції, що виконується за натисканням . Дозволяє переглянути підсвічений файл (або зайти до каталогу). Підтримує безліч форматів, таких як текстові формати, архіву, Winword DOC, файли Linux, що виконуються, і т.д.

"Перегляд файлу..."- те саме, що й попередній пункт , але діє не так на підсвічений файл , але в той, ім'я та шлях якого буде введено в діалоговому вікні.

"Перегляд команди"- дозволяє виконати команду та переглянути її стандартний висновоку режимі відтворення файлу.

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

"Копіювання"- Копіює файл з активної панелі в пасивну. Аналог функції, що викликається за . За замовчуванням, копіюється вважається підсвічений в активній панелі файл (або група файлів), а місцем призначення-каталог, відкритий в пасивній панелі. Це можна змінити, поправивши значення полів, у діалозі, що відкривається після виклику цієї команди.

"Права доступу"- дозволяє змінити права на доступ до файлу (або групи файлів) у діалоговому вікні.

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

"Власник/група"- змінює власника та/або групу, до якої належить файл/каталог.

"Права (розширені)"- дозволяє одночасно змінювати права доступу до файлу та його власника та/або групу. Права доступу представлені у вигляді трьох послідовностей rwx для власника, групи та всіх користувачів.

"Перейменування"- дозволяє перейменувати/перемістити файл. Аналог функції, що викликається за . За умовчанням переміщуваним/перейменованим вважається підсвічений в активній панелі файл (або група файлів), а місцем призначення-каталог, відкритий в пасивній панелі. Це можна змінити, поправивши значення полів, у діалозі, що відкривається після виклику цієї команди.

"Створення каталогу"- Створює каталог. Аналог функції, що викликається за . За промовчанням каталог створюється в каталозі, відкритому в активній панелі. Це можна змінити, якщо в діалозі, що відкрився, вказати повний шлях до створюваного каталогу.

"Видалення"- видаляє файл/групу файлів/каталог. Аналог функції, що викликається за .

"Зміна каталогу"- Змінює поточний каталог. Аналогічна команді cd командного інтерпретатора Bash. Необхідний каталог вводиться у діалоговому вікні.

"Відзначити групу"- Відзначає групу файлів маски в каталозі, відкритому в активній панелі. Аналог функції, що викликається за допомогою <+> на додаткову клавіатуру.

Командні оболонки з'явилися на початку розвитку Unix, вони були необхідні, оскільки це був єдиний спосіб взаємодії з системою. За цей час вони пройшли дуже довгий шлях розвитку та отримали багато нових функцій. Не так просто оцінити еволюцію командних оболонок Linux. Про це можна писати дуже довго і однієї статті точно не вистачить. Ми постараємося тільки охопити найголовніше не занурюючись дуже глибоко. Давайте спочатку розглянемо, що таке командна оболонка Linux і які оболонки бувають.

Що таке командна оболонка Linux/Unix

Unix оболонка - це інтерпретатор командного рядка, який виконує команди, які користувач вводить. Ми вводимо команду, вона інтерпретується, виконується, а потім ми отримуємо результат її виконання. Оболонка забезпечує традиційний інтерфейс уведення команд Unix, до якого ми звикли. Це, як правило, чорний екран та білий текст. Ми вводимо команди у вигляді звичайного тексту, а також можемо створювати скрипти з однієї чи кількох команд.

Оболонка – це ваш інтерфейс взаємодії із системою. Після входу в систему Unix, ви опиняєтеся у програмі, яка називається оболонка.

Thompson Shell

Якщо вірити історії та багатьом інтернет джерелам, то найпершою оболонкою була Thompson Shell, написана Кеном Томсоном в Bell Labs. Усього було 6 версій і поширювалася вона з 1971 по 1975 рік. Підтримувалися такі функції, як: перенаправлення введення/виведення та прості керуючі конструкції – if, goto. Ці функції підтримують усі сучасні командні оболонки у лінукс.

PWB Shell

Оболонка PWB – це модифікація оболонки Томсона, розроблена Джоном Машеу. Вона була написана для збільшення зручності програмування Shell. З'явилися такі цікаві структури, як if-then-else-endif, switch та цикли while.

Bourne Shell

Свій підйом Unix почав із оболонкою Борна. Вона була написана Стефаном Борном в Bell Labs і використовувалася як стандартна оболонка в Unix версії 7 від 1979 року. Тут вже було реалізовано велику кількість можливостей доступних у сучасних оболонках – доповнення імен файлів, автодоповнення команд, стандартні змінні оточення та вбудовані керуючі структури. Bourne Shell називалася sh та розміщувалася у файловій системі Unix за адресою /bin/sh.

У багатьох системах програма оболонки Борна (sh) – це символічне або жорстке посилання на одну з її альтернатив:

  • Almquist shell (ash)
  • Bourne-Again shell (bash)
  • Korn shell (ksh)
  • Z shell (zsh)

Приклад скрипта для Bourne Shell:

!/bin/sh
echo "Hello World 1!"
echo "Hello World 2!"

Almquist shell (ash)

Almquist shell ще відома як A Shell. Це легка оболонка Unix, спочатку написана Кеннетом Альмквістом. Вона була розроблена наприкінці 1980-х. Це модифікація оболонки Борна і вона замінила оригінал у BSD Unix, випущеної в 1990 році. Зараз її можна використовувати в таких дистрибутивах, як Debian і Ubuntu у вигляді версії ash під назвою dash (Debian Almquist shell) Також ця оболонка популярна на дистрибутивах Unix.

Це швидка, компактна і сумісна зі специфікаціями стандарту POSTIX оболонка Unux, і може бути саме тому часто використовується на вбудовуваних пристроях. Але ash не підтримує історію команд. Хоча у сучасних версіях цю функцію вже додано.

Bourne-Again Shell (Bash)

Написана Браєном Фоксом у рамках проекту GNU як безкоштовна та вільна заміна для оболонки Борна. Bash -найпопулярніша і широко використовується з усіх оболонок. Усі дистрибутиви Linux поставляються за умовчанням із цією оболонкою. Вона розширює набір функцій Bourne Shell. У більшості систем Unix/Linux ця оболонка може бути знайдена у файловій системі на адресу /bin/bash. Вона була випущена у 1989 році.

Завдяки такій популярності вона була портована на Windows і розповсюджується разом із набором компіляторів Cygwin та MinGW. Також Bash використовується в Android, для доступу до неї можна використовувати різні емулятори терміналу.

Тут підтримується автодоповнення, перенаправлення введення/виведення, доповнення команд, змінні та керуючі структури для ухвалення рішення (if-then-elese if) та цикли (loop).

Bash скрипти починаються з такого рядка:

Ця командна оболонка linux також підтримує читання команд із файлу та перенаправлення виведення у файл чи іншу команду.

Приклад коду на Bash:

!/bin/sh
if [ $days -gt 365 ]
then
echo This is over a year.
fi

Korn shell (ksh)

Написана Девідом Кроном та заснована на вихідниках оболонки Борна. KornShell (ksh) це оболонка, розроблена в Bell Labs ще в 1980 році. Вона має зворотну сумісність з Bourne Shell, а також включає багато рис оболонки С.

Є такі версії та модифікації:

  • Dtksh
  • MKS Korn shell

Приклад скрипту:

!/bin/ksh
print Disk space usage
du-k
exit 0

Z shell (zsh)

Пол Фальстад написав першу версію командою оболонки zsh у 1990 році. Це командна оболонка Linux, яка може бути використана як інтерактивна оболонка входу до системи, дуже потужний інтерпретатор команд. Насправді Zsh це розширена оболонка Борна з великою кількістю поліпшень, яка включає деякі функції Bash, KSH і Tcsh.

Ім'я Zsh походить від імені Єльського професора Чжун Шао (Zhong Shao), оскільки Пол був студентом Прінстонського університету.

Підтримуються такі цікаві функції:

  • Автозавершення рядків
  • Спільна історія команд для всіх сеансів оболонки
  • Поліпшено роботу зі змінними та масивами
  • Редагування кількох рядків в одному буфері
  • Корекція орфографії та багато іншого.

C shell

Оболонка також відома як Csh. Її розробив Біл Джой, коли був студентом Каліфорнійського університету. Ця оболонка дуже поширена у системах BSD Linux. Тут є багато цікавих особливостей, у тому числі контрольні структури та граматичні вирази. Ця оболонка також вперше представила велику кількість цікавих функцій, таких як історія та механізми редагування, псевдоніми, CDPATH, управління завданнями та хешування, перенаправлення виведення, приєднання, заміна змінних, виконання у фоні і т.д.

Як і інші види командних оболонок Linux тут підтримуються файли скриптів, перенаправлення та структури, що управляють. Csh зараз використовується у вигляді tcsh у багатьох системах, наприклад, MacOS X та Red Hat Linux. У Debian можна використовувати обидва варіанти CSH та Tcsh.

Приклад коду на C Shell:

!/bin/csh
if ($days > 365) then
echo This is over a year.
endif

Fish

Fish або Friendly Interactive Shell – це командна оболонка Linux нового покоління. Вона розроблена для полегшення користувача виконання команд, є підсвічування синтаксису, підсвічування правильних адрес файлів, швидкий пошук з історії, веб-конфігуратор, а також особливий синтаксис скриптів.

Це нова командна оболонка в Linux і її синтаксис несхожий на жодну з сучасних командних оболонок, а скоріше мову програмування Python.

Приклад створення функції на fish:

!/usr/bin/fish
funced su
function su
/bin/su --shell=/usr/bin/fish $argv
end
funcsave su

Більш детальне порівняння командних оболонок у Linux ви можете переглянути за посиланням.

Це все на сьогодні. Сподіваюся, вам було цікаво.

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

Що таке оболонка?

Командна оболонка ( shell) забезпечує взаємодію між користувачем та середовищем операційної системи Linux. Вона є спеціалізованим програмним продуктом, який забезпечує виконання команд та отримання результатів їх виконання, або, якщо зовсім спрощено, оболонка - це програма, яка призначена для забезпечення виконання інших програм за бажанням користувача. Прикладом оболонки може бути, наприклад, інтерпретатор команд command.comопераційної системи MS DOS, або оболонка bashопераційних систем Unix/Linux.

Всі оболонки мають схожі функції та властивості, відповідно до їх основного призначення - виконувати команди користувача та відображати результати їх виконання:

Інтерпретація командного рядка.

Доступ до команд та результатів їх виконання.

Підтримка змінних, спеціальних символів та зарезервованих слів.

Обробка файлів, операцій стандартного введення та виведення.

Реалізація спеціальної мови програмування оболонки.

    Для операційних систем сімейства Unix / Linux можливе використання кількох різних оболонок, що відрізняються властивостями та методами взаємодії із системою. Найбільш поширеними оболонками є

sh- оболонка Bourne, класична оболонка для ОС Unix

bashоболонка Bourne Again(GNU Bourne-Again SHell). Мабуть, найбільш поширена на даний момент оболонка в середовищі ОС сімейства Linux.

ksh- оболонка Korn, розроблена як розвиток оболонки Bourneз історією командного рядка та можливістю редагування команд.

csh- оболонка C, що використовує синтаксис популярної мови програмування C

tcsh- версія оболонки Cз інтерактивним редагуванням командного рядка.

У системі може бути встановлено кілька різних оболонок, і для кожного користувача можливе використання своєї оболонки, що запускається за умовчанням. Все це, звичайно, виконується автоматично в процесі завантаження та реєстрації користувача.

    У процесі завантаження операційних систем сімейства Linux після завантаження ядра системи виконується перехід в інтерактивний режим – режим взаємодії користувача та операційної системи. В ОС Linux, першим процесом, що запускається в ході завантаження, є програма ініціалізації initяка зчитує вміст конфігураційного файлу /etc/inittab, визначає перелік та характеристики терміналів, що є в системі, та викликає програму інтерактивного входу getty, що відображає запрошення для введення імені користувача. Після введення імені користувача та пароля, програма gettyвикликає програму login, яка перевіряє достовірність облікового запису, виконує перехід у домашній каталог користувача і передає управління програмі початкового запуску сеансу, якою зазвичай використовується програма оболонки користувача, конкретний різновид якої визначається вмістом файлу /etc/passwdдля цього облікового запису. Наприклад:

user1:x:508:511::/home/user1:/bin/sh
interbase:x:510:511::/home/interbase:/bin/csh
apb:x:511:513:apb:/home/apb:/bin/bash

Як видно із вмісту файлу /etc/passwdдля користувача user1буде запущена оболонка sh(оболонка Bourne), для користувача interbase- оболонка csh(оболонка C) та для користувача apb- оболонка bash(Bourne Again). Після старту оболонки на екран виводиться запрошення до введення команд (зазвичай у вигляді знака долара $ якщо робота виконується в контексті облікового запису звичайного користувача, або фунта # , якщо оболонка використовується під обліковим записом привілейованого користувача ( root).

При виході з оболонки, ядро ​​системи повертає керування програмою init, яка перезапускає процес входу в систему та на терміналі відображається запрошення до введення імені користувача. Вихід з оболонки може бути виконаний одним із двох способів:

За допомогою команди exitвиконаною користувачем

При отриманні процесом оболонки сигналу kill, відправленого ядром, наприклад, при перезавантаженні системи.

Інтерпретація командного рядка.

    Введення користувача у відповідь на запрошення оболонки зазвичай називають командним рядкомабо командою. Команда Linux - це рядок символів з імені команди та аргументів, розділених пробілами. Аргументи надають команді додаткові параметри, що визначають її поведінку. Найчастіше як аргументи використовуються опціїі іменафайлів та каталогів. Наприклад, командний рядок

ls -l file01 file02

Містить команду ls , опцію -l та два імені файлів file01 file02 .

При використанні кількох опцій їх можна об'єднувати. Наприклад, варіанти наступних команд ідентичні:

Ls -l -d
ls -ld

Команди, що є частиною оболонки, називаються вбудованими. До таких команд відносяться, наприклад, cd, if, case тощо. Природно, вбудовані команди можуть відрізнятися для різних варіантів оболонок. Крім вбудованих команд, можливе використання програмних модулів, що є окремими виконуваними файлами, або файлами скриптівабо сценаріїв- звичайних текстових файлів, що містять рядки, що послідовно виконуються, з командами оболонки. Деякі скрипти (сценарії) можуть виконуватися процесами Linux, наприклад, планувальником завдань cron. Планувальник завдань, зазвичай, призначений для автоматичного виконання завдань адміністрування системи за розкладом. Завдання cronє команди або скрипти і виконуються автоматично, без будь-якого втручання людини і можуть виконуватися в контексті різних облікових записів користувачів. У випадку, коли завдання планувальника передбачає виконання будь-якого скрипту, виникає проблема вибору оболонки, яка має бути запущена як дочірній процес cronдля обробки команд із файлу скрипта - адже оболонка може бути будь-якою, а синтаксис скрипта, як правило, передбачає використання конкретної оболонки, під яку він написаний. Для усунення цієї проблеми, в ОС сімейства Linux прийнято в першому рядку скрипту вказувати різновид оболонки, необхідної для його виконання, у вигляді:

#!/bin/bash- для оболонки bash

#!/bin/sh- для оболонки sh

Знак # є ознакою коментаря і такі символи не інтерпретуються як команда. Такий прийом дозволяє вказати, яка оболонка повинна бути використана для обробки наступного вмісту файлу. Якщо ж скрипт не містить запис, який явно визначає необхідну оболонку, то будуть використані налаштування з облікового запису, в контексті якого виконується даний скрипт. У цьому випадку можлива ситуація, коли скрипт, написаний для оболонки, наприклад, tchбуде переданий для виконання в оболонку bashщо призведе до неможливості його виконання.

Під час виконання команд або сценаріїв використовуються змінні оточення(англійською мовою - environmentзначення яких характеризують програмне середовище, в якому відбувається виконання команд. Такі змінні можуть містити загальні налаштування системи, параметри графічної або командної оболонки, шляхи файлів, що виконуються тощо. Значення змінних оточення встановлюються лише на рівні системи (для всіх користувачів) і лише на рівні конкретного користувача. Для встановлення змінних оточення на рівні системи використовується вміст файлів:

/etc/profile- встановлює змінні лише командних оболонок. Може запускати будь-які скрипти в оболонках, сумісних із Bourne shell.

/etc/bash.bashrc- встановлює змінні лише інтерактивних оболонок. Він також запускає bash-скрипти.

/etc/environment- Використовується модулем PAM-env. У цьому файлі можна вказувати лише пари ім'я = значення.

Кожен із цих файлів має свої особливості застосування, тому слід уважно вибирати той, який підходить для ваших цілей. Наприклад, якщо потрібно додати користувальницький каталог ~/binу змінну PATHдля всіх користувачів, помістіть наступний код в один із системних файлів ініціалізації оточення (/etc/profile або /etc/bash.bashrc):

# Якщо ідентифікатор ID користувача більше або дорівнює 1000, існує каталог ~/bin, і він

#не був раніше доданий до змінної PATH,

# виконати експорт ~/bin у змінну $PATH.

If [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin)

Export PATH=$HOME/bin:$(PATH)

Як правило, в операційних системах Linux ідентифікатор користувача менше 1000 або менше 500 використовується для службових облікових записів. У цьому прикладі змінна оточення буде встановлена ​​для всіх локальних користувачів системи з ідентифікатором 1000 або більше.

Якщо потрібно змінити середовище оточення для конкретного користувача, використовується модифікація вмісту середовища оточення користувача:

- ~/.bash_profile, ~/.bash_loginі т.п. - Файли ініціалізації командної оболонки з домашнього каталогу користувача.

- ~/.profile- файл ініціалізації профілю користувача. Використовується багатьма оболонками визначення змінних середовища.

~/.pam_environment- Користувальницький аналог файлу /etc/environment, який використовується модулем PAM-env.

Наприклад, щоб додати каталог користувача ~/bin у шляху пошуку виконуваних файлів, заданих змінною PATHнаприклад, у файл ~/.profileпомістити рядок:

export PATH="$(PATH):/home/користувач/bin"

Щоб встановити змінні оточення для графічних програм, використовується вміст файлів налаштування графічного середовища користувачів ~/.xinitrc

Набагато частіше значення змінних оточення задаються для поточного сеансу користувача. Наприклад, для додавання користувача каталогу ~/binу шляху пошуку виконуваних файлів:

export PATH=~/bin:$PATH

Нове значення змінної PATHдіятиме лише до завершення поточного сеансу користувача.

Для перегляду змінної можна використовувати команду echo $змінна, наприклад:

echo $PATH

В даний час, найпоширенішою оболонкою, як уже згадувалося вище, є bash. Викликано це, насамперед тим, що оболонка bashє sh- сумісною командною оболонкою, до якої додано корисні можливості з оболонок Korn shell ( ksh) та C shell ( csh). Оболонка bashможе без будь-якої модифікації виконувати більшість скриптів, написаних під мову програмування оболонки shі максимально намагається наблизитися до стандарту POSIX, що призвело до появи множини поліпшень, причому як для програмування, так і використання в інтерактивному режимі. У сучасній реалізації bashє режим редагування командного рядка, необмежений обсяг історії команд, засоби управління завданнями, можливість використання псевдонімів, великий список вбудованих команд, функції командної оболонки тощо. В цілому, bashнайбільшою мірою відповідає потребам середньостатистичного користувача, що й зробило її найбільш використовуваною серед Linux.

При запуску bashбез параметрів командного рядка оболонка запускається в інтерактивному режимі, відображаючи на екрані запрошення до введення команд. Інтерактивна оболонка зазвичай читає дані з терміналу користувача і пише дані в цей термінал, стандартним пристроєм введення є клавіатура, а стандартним пристроєм виведення - дисплей. Користувач вводить команди на клавіатурі, а результат виконання відображається на дисплеї.

  • Tutorial

Навіщо та для кого стаття?

Спочатку це була пам'ятка для студентів, які починають працювати з unix-подібними системами. Іншими словами, стаття розрахована на тих, хто не має попереднього досвіду роботи в UNIX-овому командному рядку, але з тих чи інших причин хоче або повинен навчитися ефективно з нею взаємодіяти.

Тут не буде переказу манів (документації), і стаття ніяк не скасовує та не замінює їхнього читання. Натомість я розповім про головні речі (команда, прийоми та принципи), які треба усвідомити з самого початку роботи в unix shell-і, щоб робота відбувалася ефективно і приємно.

Стаття стосується повноцінних unix-подібних оточень, з повнофункціональним шеллом (переважно zsh або bash) і досить широким набором стандартних програм.

Що таке шелл

Shell (шелл, він же "командний рядок", він же CLI, він же "консоль", він же "термінал", він же "чорне віконце з білими літерами") - це текстовий інтерфейс спілкування з операційною системою (ну, суворо кажучи, це програма, яка такий інтерфейс забезпечує, але сьогодні це відмінність несуттєво).

В цілому робота через шелл виглядає так: користувач (тобто ви) з клавіатури вводить команду, натискає Enter, система виконує команду, пише на екран результат виконання, і знову чекає на введення наступної команди.

Типовий вигляд шеллу:

Шелл – це основний спосіб для взаємодії з усіма Unix-подібними серверними системами.

Де зустрічаються системи із командним рядком?

Де вас може чекати unix-овий шелл, популярні варіанти:
  • MacOS (Bash);
  • віддалений доступ на сервер для роботи або для особистого веб-проекту;
  • домашній файл-сервер із віддаленим доступом;
  • Ubuntu, PC-BSD на ноутбуці/десктопі - unix-подібні системи сьогодні прості у встановленні та використанні.

Які завдання розумно розв'язувати шеллом?

Природні завдання, для яких придатний шелл, корисний і незамінний:
  • інтерактивна робота у терміналі:
    • виконання компіляції; запуск завдань через make;
    • порівняння текстових файлів;
    • швидкий ad-hoc аналіз даних (кількість унікальних ip у лозі, розподіл записів по годинах/хвилинах тощо);
    • разові масові дії (прибити багато процесів; якщо працюєте із системою контролю версій – ревертнути або зарезолвити купу файлів);
    • діагностика того, що відбувається в системі (семафори, локи, процеси, дескриптори, місце на диску тощо);
  • скриптування:
    • настановні скрипти, до виконання яких не можна розраховувати на наявність інших інтерпретаторів - це для новачків;
    • функції для кастомізації інтерактивного шелла (що впливають на запрошення, що змінюють каталог, що встановлюють змінні оточення) – теж не зовсім для новачків;
    • одноразові скрипти типу масового перекодування файлів;
    • makefile-и.

Абсолютно перші кроки

Починаємо роботу: увійти та вийти

Переконайтеся, що знаєте, як запустити шелл і як з нього вийти.

Якщо ви працюєте за машиною, на якій встановлено Ubuntu, вам потрібно запустити програму Terminal. Після закінчення роботи можна просто закрити вікно.

На MacOS – теж запустити Terminal.

Для доступу до віддаленого сервера – скористатися ssh (якщо локально у вас MacOS, Ubuntu або інша unix-like система) або putty (якщо у вас Windows).

Хто я де я?

Виконайте такі команди:
  • hostname - виводить ім'я машини (сервера), де ви зараз перебуваєте;
  • whoami - виводить ваш логін (ваше ім'я у системі);
  • tree -d / |less - псевдографічне зображення дерева каталогів на машині; вихід з перегортання - q;
  • pwd - виводить каталог, у якому ви зараз перебуваєте; у командному рядку ви не можете бути просто так, ви обов'язково знаходитесь в якомусь каталозі (=поточний каталог, робочий каталог). Ймовірно, поточний робочий каталог виводиться у запрошенні (prompt).
  • ls – список файлів у поточному каталозі; ls /home - список файлів у вказаному каталозі;

Історія команд (history)

Важлива властивість повноцінного командного рядка – історія команд.

Виконайте кілька команд: hostname, ls, pwd, whoami. Тепер натисніть клавішу "вгору". У рядку введення з'явилася попередня команда. Клавішами "вгору" і "вниз" можна переміщатися вперед і назад з історії. Коли догортаєте hostname , натисніть Enter - команда виконається ще раз.

Команди з історії можна не просто виконувати повторно, а ще й редагувати. Дістайте історію до команди ls , додайте до неї ключ -l (вийшло ls -l перед мінусом пробіл є, а після - ні). Натисніть Enter – виконається модифікована команда.

Перегортання історії, редагування та повторне виконання команд - найтиповіші дії при роботі в командному рядку, звикайте.

Copy-paste

Командний рядок дуже текстоцентричний: команди - це текст, вхідні дані для більшості стандартних програм - текст, результат роботи - найчастіше теж текст.

Прекрасною особливістю тексту є те, що його можна копіювати та вставляти, це вірно і для командного рядка.

Спробуйте виконати команду date +"%y-%m-%d, %A"
Чи ви вводили її цілком руками або скопіювали зі статті? Переконайтеся, що ви можете скопіювати її, вставити в термінал і виконати.

Після того, як навчитеся користуватися man, переконайтеся, що можете скопіювати і виконати приклади команд з довідки. Для перевірки знайдіть у довідці за програмою date розділ EXAMPLES, скопіюйте і виконайте перший наведений приклад (про всяк випадок: знак долара не є частиною команди , це умовне зображення запрошення до введення).

Як саме копіювати текст із терміналу та вставляти його в термінал – залежить від вашої системи та від її налаштувань, тому дати універсальну інструкцію, на жаль, не вдасться. На Ubuntu спробуйте так: копіювання – просто виділення мишею, вставка – середня кнопка миші. Якщо не працює, або якщо у вас інша система - пошукайте в Інтернеті або запитайте досвідченіших знайомих.

Ключі та опції

При дослідженні історії команд ви вже зіткнулися з тим, що команда ls має принаймні два варіанти. Якщо викликати її просто так, вона виводить простий список:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Якщо додати ключ -l , до кожного файлу виводиться докладна інформація:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Це дуже типова ситуація: якщо до виклику команди додавати спеціальні модифікатори (ключ, опції, параметри), поведінка команди змінюється. Порівняйте: tree / і tree -d / , hostname і hostname -f.

Крім того, команди можуть приймати як параметри імена файлів, каталогів або просто текстові рядки. Спробуйте:

Ls -ld /home ls -l /home grep root /etc/passwd

man

man - довідка за командами та програмами, доступними на вашій машині, а також за системними викликами та стандартною бібліотекою C.

Спробуйте: man grep, man atoi, man chdir, man man.

Перегортання вперед і назад робиться кнопками "вгору", "вниз", "PageUp", "PageDown", вихід з перегляду довідки - кнопкою q. Пошук певного тексту у довідковій статті: натисніть / (прямий слєш), введіть текст для пошуку, натисніть Enter. Переміщення до наступних входів - клавіша n.

Усі довідкові статті поділяються на категорії. Найважливіші:

  • 1 - виконувані програми та шульні команди (wc, ls, pwd і т.п.);
  • 2 - системні виклики (fork, dup2 і т.п.)
  • 3 - бібліотечні функції (printf, scanf, cos, exec).
Вказувати, з якої категорії треба показати довідку, потрібно у випадках збігів імен. Наприклад, man 3 printf описує функцію зі стандартної бібліотеки C, а man 1 printf - консольну програму з таким самим ім'ям.

Переглянути всі доступні на машині довідкові статті можна за допомогою команди man -k . (Точка - теж частина комади).

less

Коли у невеликому вікні терміналу треба переглянути дуже довгий текст (вміст якогось файлу, довгий man тощо) використовують спеціальні програми-«пейджери» (від слова page/сторінка, тобто посторінкові листатели). Найпопулярніший листівник - less, і саме він забезпечує вам перегортання, коли ви читаєте man-и.

Спробуйте та порівняйте поведінку:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

Можна передати файл до прогортання відразу в параметрах:

Less /etc/bash.bashrc

Перегортання вгору та вниз – кнопки «вгору», «вниз», «PageUp», «PageDown», вихід – кнопка q . Пошук певного тексту: натисніть / (прямий слєш), введіть текст для пошуку, натисніть Enter. Переміщення до наступних входів - клавіша n. (Дізнаєтеся інструкцію про man? Нічого дивного, для виведення довідки теж використовується less.)

Права

З будь-яким файлом чи каталогом пов'язаний набір «прав»: декларація про читання файлу, декларація про запис файл, право виконувати файл. Усі користувачі поділяються на три категорії: власник файлу, група власника файлу, решта користувачів.

Переглянути права на файл можна за допомогою ls-l. Наприклад:

> ls -l Makefile -rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Цей висновок означає, що власнику (akira) можна читати і писати файл, групі (students) – тільки читати, всім іншим користувачам – теж тільки читати.

Якщо при роботі ви отримуєте повідомлення permission denied , це означає, що у вас недостатньо правий об'єкт, з яким ви хотіли працювати.

Докладніше читайте в man chmod.

STDIN, STDOUT, конвеєри (пайпи)

З кожною програмою, що виконується, пов'язані 3 стандартних потоку даних: потік вхідних даних STDIN , потік вихідних даних STDOUT , потік для виведення помилок STDERR .

Запустіть програму wc, введіть текст Good day today, натисніть Enter, введіть текст good day, натисніть Enter, натисніть Ctrl+d. Програма wc покаже статистику за кількістю літер, слів та рядків у вашому тексті та завершиться:

> wc good day today good day 2 5 24
У цьому випадку ви подали в STDIN програми дворядковий текст, а в STDOUT отримали три числа.

Тепер запустіть команду head -n3 /etc/passwd , має бути приблизно так:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
У цьому випадку програма head нічого не читала зі STDIN, а в STDOUT написала три рядки.

Можна уявити так: програма - це труба, у якому втікає STDIN , а витікає STDOUT .

Найважливіша властивість юніксового командного рядка полягає в тому, що програми-«труби» можна з'єднувати між собою: вихід (STDOUT) однієї програми передавати як вхідні дані (STDIN) іншій програмі.

Така конструкція зі з'єднаних програм називається англійською pipe (труба), російською - конвеєр або пайп.

Об'єднання програм на конвеєр робиться символом | (вертикальна характеристика)

Виконайте команду head -n3 /etc/passwd |wc , вийде приблизно таке:

> head -n3 /etc/passwd |wc 3 3 117
Сталося ось що: програма head видала в STDOUT три рядки тексту, які одразу ж потрапили на вхід програмі wc , яка підрахувала кількість символів, слів і рядків в отриманому тексті.

У конвеєр можна поєднувати скільки завгодно програм. Наприклад, можна додати до попереднього конвеєра ще одну програму wc, яка підрахує, скільки слів і літер було у висновку першої wc:

> head -n3 /etc/passwd |wc |wc 1 3 24

Складання конвеєрів (пайпів) - дуже часта справа під час роботи у командному рядку. Приклад того, як це робиться на практиці, читайте в розділі «Упорядкування конвеєра-однострочника».

Перенаправлення введення-виведення

Висновок (STDOUT) програми можна не лише передати іншій програмі за конвеєром, але й просто записати у файл. Таке перенаправлення здійснюється за допомогою > (знак «більше»):

Date > /tmp/today.txt
В результаті виконання цієї команди на диску з'явиться файл /tmp/today.txt. Перегляньте його вміст за допомогою cat /tmp/today.txt

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

Якщо потрібно не перезаписати файл, а додати висновок у його кінець, використовуйте >>:

Date >> /tmp/today.txt
Перевірте, чи записано у файлі.

Крім того, програмі можна замість STDIN передати будь-який файл. Спробуйте:

Wc

Що робити, коли щось незрозуміло

Якщо ви стикаєтеся з поведінкою системи, яку не розумієте, або хочете досягти певного результату, але не знаєте, як саме, раджу діяти в наступному порядку (до речі, це стосується не тільки шеллів):
  • наскільки можливо чітко сформулюйте питання чи завдання – немає нічого складнішого, ніж вирішувати «те, не знаю що»;
  • пригадайте, чи ви вже стикалися з такою ж або подібною проблемою - у цьому випадку варто спробувати рішення, яке спрацювало минулого разу;
  • почитайте відповідні man-и (якщо розумієте, які man-и підходять у вашому випадку) - можливо, ви знайдете відповідні приклади використання команд, потрібні опції або посилання на інші команди;
  • подумайте: чи не можна трохи змінити завдання? - можливо, трохи змінивши умови, ви отримаєте завдання, яке вже вмієте вирішувати;
  • задайте своє чітко сформульоване питання у пошуковій системі - можливо, відповідь знайдеться на Stack Overflow або на інших сайтах;
Якщо нічого з перерахованого не допомогло - зверніться за порадою до викладача, досвідченого колеги чи товариша. І не бійтеся ставити «дурні» питання – не соромно не знати, соромно не питати.

Якщо ви розібралися зі складною проблемою (самостійно, за допомогою Інтернету або інших людей) - запишіть своє рішення на випадок, якщо така проблема знову виникне у вас або ваших товаришів. Записувати можна в простий текстовий файл, Evernote, публікувати в соц.мережах.

Методи роботи

Копіювати-і-вставити- з man-ів, зі статей на StackOverflow і т.п. Командний рядок складається з тексту, користуйтеся цим: копіюйте та використовуйте приклади команд, записуйте вдалі знахідки на згадку, публікуйте їх у твіттерах та блогах.

Витягти з історії попередню команду, додати до конвеєра ще одну команду, запустити, повторити.Див. також розділ «Упорядкування конвеєра-однострочника».

Базові команди

  • перехід до іншого каталогу: cd;
  • перегляд вмісту файлів: саt, less, head, tail;
  • маніпуляції з файлами: cp, mv, rm;
  • перегляд вмісту каталогів: ls, ls -l, ls -lS;
  • структура каталогів: tree , tree -d (можна передати як параметр каталог);
  • пошук файлів: find. -name ...;

Аналітика

  • wc, wc-l;
  • sort -k - сортування за вказаним полем;
  • sort -n - числове соритровка;
  • diff – порівняння файлів;
  • grep, grep-v, grep-w, grep "\ ", grep -E - пошук тексту;
  • uniq , uniq -c - Унікалізація рядків;
  • awk - у варіанті awk "(print $1)", щоб залишити тільки перше поле з кожного рядка, $1 можна міняти на $2, $3 і т.д.;

Діагностика системи

  • ps axuww - інформація про процеси (запущені програми), що працюють на машині;
  • top - інтерактивний перегляд найбільш ресурсомістких процесів;
  • df - зайняте та вільне місце на диску;
  • du – сумарний розмір файлів у каталозі (рекурсивно з підкаталогами);
  • strace , ktrace – які системні виклики виконує процес;
  • lsof – які файли використовує процес;
  • netstat -na , netstat -nap - які порти та сокети відкриті в системі.

Деяких програм у вас може бути, їх треба встановити додатково. Крім того, деякі опції цих програм доступні лише привілейованим користувачам (root "у").

Масове та напівавтоматичне виконання

Спочатку пропускайте цей розділ, ці команди і конструкції знадобляться вам тоді, коли дістанетеся до нескладного шовкового скриптингу.
  • test - перевірка умов;
  • while read - цикл за рядками STDIN;
  • xargs - підстановка рядків із STDIN у параметри зазначеної програми;
  • seq – генерація послідовностей натуральних чисел;
  • () - об'єднати виведення кількох команд;
  • ; - Виконати одне за одним;
  • && - виконати за умови успішного завершення першої команди;
  • || - Виконати за умови невдалого завершення першої команди;
  • tee - продублювати виведення програми в STDOUT і файл на диску.

Різне

  • date – поточна дата;
  • curl - завантажує документ за вказаним url і пише результат на STDOUT;
  • touch – оновити дату модифікації файлу;
  • kill - надіслати процесу сигнал;
  • true - нічого не робить, повертає істину, корисна для організації вічних циклів;
  • sudo - виконати команду від імені root а.

Складання конвеєра-однорядника

Давайте розглянемо приклад реального завдання: потрібно прибити всі процеси task-6-server, запущені від імені користувача.

Крок 1.
Зрозуміти, яка програма видає приблизно потрібні дані, хоча б не в чистому вигляді. Для нашого завдання варто отримати список усіх процесів у системі: ps axuww. Запустити.

Крок 2
Подивитися на отримані дані очима, вигадати фільтр, який викине частину непотрібних даних. Часто це grep або grep-v. Кнопками «Вгору» витягти з історії попередню команду, приписати до неї вигаданий фільтр, запустити.

Ps axuww | grep `whoami`
- Тільки процеси поточного користувача.

Крок 3
Повторювати пункт 2, доки не вийдуть чисті дані.

"
- всі процеси з потрібним ім'ям (плюс, можливо, зайві на зразок vim task-6-server.c і т.п.),

Ps axuww | grep `whoami` | grep "\ | | grep -v vim ps axuww | grep `whoami` | grep "\ " | grep -v vim | grep -v less
- Тільки процеси з потрібним ім'ям

Ps axuww | grep `whoami` | grep "\ grep -v vim |grep -v less |awk "(print $2)"

Pid-и потрібних процесів, п. 3 виконаний

Крок 4.
Застосувати відповідний фінальний обробник. Клавішами «Вгору» витягуємо з історії попередню команду та додаємо обробку, яка завершить вирішення завдання:

  • |wc -l щоб порахувати кількість процесів;
  • >pids щоб записати pid-и файл;
  • | xargs kill -9 вбити процеси.

Завдання для тренування

Хочете попрактикуватися в нових вміннях? Спробуйте виконати такі завдання:
  • отримайте список усіх файлів та каталогів у вашому домашньому каталозі;
  • отримайте список всіх man-статей із категорії 2 (системні виклики);
  • порахуйте, скільки разів у man-і за програмою grep зустрічається слово grep;
  • порахуйте, скільки процесів запущено в даний момент від імені користувача root;
  • знайдіть, яка команда зустрічається у максимальній кількості категорій довідки (man);
  • підрахуйте скільки разів зустрічається слово var на сторінці ya.ru .
Підказка: вам знадобиться find, grep-o, awk "(print $1)", регулярні вирази в grep, curl-s.

Що вивчати далі?

Якщо командний рядок починає вам подобається, не зупиняйтеся, продовжуйте вдосконалювати свої навички.

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

  • find зі складними опціями
  • apropos
  • locate
  • telnet
  • netcat
  • tcpdump
  • rsync
  • screen
  • zgrep, zless
  • visudo
  • crontab -e
  • sendmail
Крім того, згодом варто освоїти якусь скриптову мову, наприклад, perl або python, або навіть їх обидва.

Кому це треба?

А чи варто взагалі вивчати сьогодні командний рядок та шелльний скриптинг? Виразно стоїть. Наведу лише кілька прикладів вимог Facebook до кандидатів, які хочуть вступити на роботу у FB.

Напевно, майже всі читачі Хабра знають оболонки sh і bash. Також більшість із нас щось чули про zsh і tcsh. Однак на цьому список існуючих оболонок не закінчується. Умовно можна поділити їх на три групи:

  • Клони Bourne shell (bash, zsh)
  • C shell (csh, tcsh)
  • Які базуються на популярних мовах програмування (psh, ipython, scsh)
  • Екзотичні, специфічні та інші
Про найцікавіші з них і йтиметься.

Метою написання статті був огляд чи класифікація всіх існуючих командних оболонок. Просто хочу розповісти про деякі цікаві продукти у цій галузі, розширити кругозір читача. Буду радий. якщо цим спонукаю когось до більш детального вивчення теми або навіть до того, щоб перейти на інший йшов.
Спочатку коротко про те, що це таке. Командна оболонка або командний інтерпретатор - це додаток, що надає користувачеві інтерфейс командного рядка, в якому той або вводить команди окремо, або запускає скрипти, що складаються зі списку команд. Усно і в неофіційних текстах часто називається «йшов», від англійської shell – оболонка.

Найбільшого поширення набули POSIX-сумісні оболонки, що ведуть родовід від Bourne shell (шелл Борна), тому з нього і почнемо

Bourne shell та його клони

Bourne shell, виконуваний файл: sh. Командна оболонка названа на честь свого творця Стівена Борна. Більшість операторів була запозичена ним з мови Алгол 68. Вийшла в 7-му виданні операційної системи UNIX, де була стандартною оболонкою. До цих пір переважна більшість Unix-подібних систем мають /bin/sh - символічне або жорстке посилання на sh-сумісну оболонку.

Bourne again shell, виконуваний файл: bash. Назву можна перекласти, як «Відроджений йшов Борна». Швидше за все найпопулярніша оболонка на сьогоднішній день. Де-факто стандарт для Linux. Не буду на ній зупинятись, т.к. в інтернеті багато хороших статей про bash Наприклад ось і ось.

Z shell, виконуваний файл: zsh. Вільна сучасна sh-сумісна оболонка. Має ряд переваг перед bash, що стосуються в основному роботи в інтерактивному режимі. Про неї на Хабре писали і
Крім того існує досить багато оболонок, що потрапляють до цієї групи: Korn shell (ksh) і Almquist shell (ash) etc, але не будемо докладно на них зупинятися.

C shell

C shell, виконуваний файл: cshКомандна оболонка розроблена автором vi Біллом Джоєм. За основу для скриптової мови csh було взято, як відомо з назви, мову C. Т.к. на той момент, у 1978 р., це була найпопулярніша мова програмування серед розробників та користувачів BSD UNIX. Зараз популярніша вільна реалізація csh - tcsh.

TENEX C Shell, виконуваний файл: tcsh. Саме у tcsh колись уперше з'явилося автодоповнення. Є оболонкою за промовчанням у FreeBSD. Докладніше про неї почитати можна.
Для того щоб наочно показати різницю в синтаксисі наведу кілька прикладів скриптів, що роблять те саме для csh і sh-сумісного командного інтерпретатора.

Умовна конструкція:

Цикл обчислює 10 перших ступенів двійки:

#!/bin/sh i = 2 j = 1 while [$ j -le 10]; do echo "2 **" $j = $i i=`expr $i "*" 2` j=`expr $j + 1` done #!/bin/csh set i = 2 set j = 1 while ($j<= 10) echo "2 **" $j = $i @ i *= 2 @ j++ end

Однак список фіч підтримуються свіжими версіями bash, zsh і tcsh дуже схожий і вибір конкретної оболонки здебільшого справа смаку. З менш поширеними оболонками справа інакша. Тут відмінності суттєвіші.

Командні оболонки, що базуються популярними мовами програмування.

Perl Shell, виконуваний файл: psh. Оболонка поєднує у собі функції вищезгаданих оболонок та міць мови Perl. Т.к. psh написана на perl вона може запускатись навіть на Windows. Декілька прикладів використання psh:
ls | s/y/k/ # Заміна за допомогою регулярних виразів ls | ( print ++$i, ": $_"; )q # Швидкі фільтр. Усередині фігурних дужок вираз на perl, де $_ містить один рядок виведення. netstat | ($_>2; )g # grep-фільтри. Виводяться лише ті рядки, для яких вираз у дужках повертає true command >[=FOO] # Перенаправлення по дескриптору відкритого файлу command > file # Еквівалентно command 2> file на bash. Перенаправляє у файл потік виведення та помилок grep foo lib/**/*.pm # Використання **, що означає поточний каталог та всі підкаталоги

Scsh, виконуваний файл scsh. Командний інтерпретатор з відкритим кодом використовує як скриптову мову Scheme 48. Не підтримує стандартні для інших оболонок функції (історія команд, редагування тексту в командному рядку, доповнення шляхів/команд). Рекомендується написання скриптів, але з інтерактивної роботи. Може прийтись до смаку любителям функціонального програмування. Нижче наведено приклад скрипта, який виводить імена всіх файлів, що виконуються, що знаходяться в каталогах зі змінної оточення PATH
#!/usr/local/bin/scsh -s !# (define (executables dir) (with-cwd dir (filter file-executable? (directory-files dir #t))))) (define (writeln x) (display x) (newline)) (for-each writeln (append-map executables ((infix-splitter ":") (getenv "PATH")))))

IPython. Це інтерактивна оболонка для мови програмування Python, що має низку додаткових функцій. IPython має спеціальний профіль для роботи як системна командна оболонка. Спосіб запуску цього режиму залежить, як я зрозумів, від версії, але на моїй машині це виглядає так:
ipython3 --profile=pysh

Про IPython вже написано досить багато навіть російською мовою (посилання наприкінці статті). Намагаюся перерахувати його основні фічі з точки зору застосування його як командної оболонки:

  • Кросплатформність. Є навіть версія під Windows
  • Python версій 2.x або 3.x як скриптова мова, розширені можливості інтроспекції
  • Автодоповнення коду Python а також імен файлів і системних команд.
  • Історія команд та макроси на її основі
  • Механізм прискорює навігацію за каталогами, закладки та багато іншого
Як бачите, за своїми інтерактивними можливостями IPython як мінімум не поступається bash. Що ж до скриптів, то IPython буде зручним тим, хто знає python краще ніж bash. По суті скрипти на IPython відрізнятимуться від чистого пітона лише запитаним викликом системних команд. Наведу кілька прикладів інтеграції python та системних команд:
# Допустимо нам захотілося порахувати сумарний розмір файлів логів dpkg: In : cd /var/log/ /var/log In : log_files = !ls -l dpkg.log* 1 root root 1824 Листопада 3 16:41 dpkg.log" In : for line in log_files: ....: size += int(line.split()) ....: In : size Out: 1330009 # . .. або послідовно пінганути десяток хостів In : for i in range(100,110): ....: !ping -c 1 192.168.0.$i ....:
Інші
Звичайно, це не повний список навіть популярних оболонок. Крім перелічених вище категорій існують ще використовують власний синтаксис, не сумісний з sh і не копіює існуючі ЯП. Прикладом може бути friendly interactive shell (fish). Але наостанок хотів би розповісти не про неї, а про більш специфічну склепіння.

Sleep Dummy Shell, виконуваний файл: sleepshell. Строго кажучи, командним процесором sleepshell назвати не можна, т.к. він не вміє обробляти команди. І взагалі не вміє нічого, окрім як періодично записувати у стандартний висновок зірочки "*". Однак використовується вона саме як командна оболонка і ось для чого: Допустимо ми хочемо надати комусь можливість робити тунелі ssh через наш сервер під управлінням Linux або Unix. Детальніше про ssh-тунелювання читаємо. Але нам не потрібно при цьому, що цей хтось отримав доступ до командного рядка та файлової системи нашого сервера. Для такої нагоди і призначена шкіраоболонки. Створюємо на сервері обліковий запис як шов для нього встановлюємо sleepshell. Власник облікового запису зможе підключатися та прокидати порти, але не зможе виконувати команди.

На цьому все. Сподіваюся, що було цікаво. Буду радий будь-яким зауваженням та порадам за текстом статті.

Посилання по темі
www.faqs.org/faqs/unix-faq/shell/shell-differences - зведена таблиця відмінностей та подібностей командних оболонок
www.mariovaldez.net/software/sleepshell - Sleep Dummy Shell
ipython.org/ipython-doc/dev/interactive/shell.html - IPython as a system shell
www.opennet.ru/base/dev/ipython_sysadmin.txt.html - Оболонка IPython як інструмент системного адміністратора