Донецкий техникум промышленной автоматики

командний інтерпретатор

  1. Матеріал з Xgu.ru Короткий URL: shell [ правити ] Що таке командний інтерпретатор?
  2. [ правити ] Запуск інтерпретатора
  3. [ правити ] Робота інтерпретатора
  4. [ правити ] Введення командного рядка
  5. [ правити ] Редагування
  6. [ правити ] Історія команд
  7. [ правити ] автоматичне продовження
  8. [ правити ] Приклад. Автоматичне продовження в bash
  9. [ правити ] Обробка командного рядка
  10. [ правити ] Файлові шаблони
  11. [ правити ] Приклад. файлові шаблони
  12. [ правити ] Фігурні дужки
  13. [ правити ] Приклад. Дужковий підстановка
  14. [ правити ] Командна підстановка
  15. [ правити ] Приклад. командна підстановка
  16. [ правити ] Підстановка змінних і параметрів
  17. [ правити ] Заміна тильди
  18. [ правити ] Арифметична підстановка
  19. [ правити ] Приклад. арифметична підстановка
  20. [ правити ] Екранування і лапки
  21. [ правити ] Перенаправлення і канали
  22. [ правити ] Перенаправлення
  23. [ правити ] Приклад. перенаправлення
  24. [ правити ] Канали
  25. [ правити ] Канали
  26. [ правити ] Програми-фільтри
  27. [ правити ] Послідовності команд і командні конструкції
  28. [ правити ] Питання та відповіді
  29. [ правити ] Додаткова інформація

Матеріал з Xgu.ru Короткий URL: shell

[ правити ] Що таке командний інтерпретатор?

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

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

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

ОС Linux використовує кілька різних видів інтерпретаторів. Найбільш поширеними серед них є:

  • sh. Bourne Shell. Прообраз командних інтерпретаторів сьогоднішнього дня. В сучасних Linux-системах sh є символічне посилання на файл bash;
  • bash. Bourne-Again SHell. Основний командний інтерпретатор ОС Linux. Являє собою розвиток ash і sh. Підтримує багата мова написання скриптів, зручний інтерфейс для редагування командного рядка, автоматичне продовження команд і безліч інших корисних можливостей;
  • tcsh. C Shell. Розширена версія інтерпретатора C Shell, що використовується в BSD-системах. Підтримує функцію автозаповнення тексту і розширені можливості редагування;
  • zsh. Дуже розвинений командний інтерпретатор, який об'єднує в собі можливості csh, bash з додатковими, такими як: поліпшена підтримка автоматичного продовження, більш розвинені можливості редагування, розширені файлові шаблони і ряд інших;
  • nash. Not A SHell. Гранично полегшена оболонка, призначена для інтерпретації сценаріїв в linuxrc файлах, при завантаженні з віртуального диска initrd. Не дозволяє працювати користувачеві в інтерактивному режимі.

Відмінною особливістю програм інтерпретаторів, є дві букви sh, в кінці їх імені (від англ. Shell - оболонка, командний інтерпретатор). Як працює командний інтерпретатор?

[ правити ] Запуск інтерпретатора

Командний інтерпретатор викликається автоматично програмою login при вході користувача в систему, але може бути викликаний і явно:

$ bash

Після запуску інтерпретатор виконує ініціалізацій скрипти. Порядок виконання відповідає зазначеному нижче.

Ініціалізацій скрипти.

/ etc / profile

Загальносистемний скрипт налаштування середовища. Виконується один раз при вході в систему (login shell) ~ / .bash_profile користувача скрипт налаштування середовища. Виконується один раз при вході в систему (login shell) ~ / .bashrc користувача ініціалізації скрипт командного інтерпретатора. Виконується кожен раз при запуску інтерпретатора в інтерактивному режимі, тобто якщо він не використовується для виконання скриптів / etc / bashrc Загальносистемний ініціалізації скрипт командного інтерпретатора. Викликається файлом ~ / .bashrc

[ правити ] Робота інтерпретатора

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

[User @ host dir] $

За замовчуванням запрошення містить інформацію про ім'я користувача, імені комп'ютера і поточному каталозі. Завершальним символом є $ або # в залежності від того, чи володіє користувач, від імені якого запущено інтерпретатор, привілеями суперкористувача (#) чи ні ($).

Формат запрошення можна налаштувати за допомогою змінної командного інтерпретатора PS1

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

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

Команда може виконуватися у фоновому режимі. Для цього після її назви потрібно поставити символ & амперсанд. В цьому випадку, управління відразу ж повертається інтерпретатора, команда при цьому продовжує виконується. При її завершенні на екран буде видано інформаційне повідомлення про це.

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

  • Файлові шаблони. Спеціальні метасимволу, необхідні для опису груп файлів;
  • Перенаправлення. Механізм, що забезпечує взаємодію незв'язаних між собою програм: дані, що надходять з виходу однієї програми потрапляють на вхід іншого.
  • Змінні інтерпретатора. Командний інтерпретатор використовує змінні як тимчасове сховище даних, необхідне йому для нормальної роботи: наприклад, змінні можуть використовуватися в скриптах інтерпретатора або для передачі налаштувань. Змінні також забезпечують зручний доступ до середовища оточення програм.
  • Скриптинг. Команди можуть не вводиться користувачем в інтерактивному режимі, а зчитуватися з заздалегідь підготовленого файлу. Це полегшує багаторазове виконання однакових або схожих між собою дій. Інтерпретатори розвивають цю ідею, дозволяючи обробляти не просто послідовність поспіль команд, а цілі сценарії, що містять конструкції алгоритмічних мов програмування: цикли, розгалуження, функції.

[ правити ] Введення командного рядка

Командний інтерпретатор bash робить редагування командного рядка гранично ефективним. Введення рядка здійснюється швидко і точно. Для виконання цих вимог bash володіє кількома особливостями:

  • Потужний і гнучко настроюється інтерфейс редагування командного рядка;
  • Історія команд;
  • Автоматичне продовження.

[ правити ] Редагування

Командний інтерпретатор bash надає дуже багатий інтерфейс для введення і редагування командного рядка. Інтерфейс значною мірою повторює інтерфейси таких текстових редакторів як vi (set -o vi) і emacs (set -o emacs; використовується за умовчанням). Підтримуються команди швидкого переміщення, видалення, вставки, управління історією, автозавершення, макроси і багато інших.

Перераховані прив'язки до клавіш не є жорсткими. Інтерфейс може бути гнучко настроєний шляхом настройки бібліотеки GNU readline . Інтерпретатор bash підтримує більше сотні вбудованих команд, які полегшують редагування.

Клавіші при редагуванні командного рядка.

Ctrl-a (Home) |Ctrl-e (End)

Перехід до початку | кінця рядка Ctrl-b (вліво) | Ctrl-f (вправо) Перехід на один символ вліво | вправо Meta-b | Meta-f Перехід на одне слово вліво | вправо Ctrl-l Очищення екрану Ctrl-d (Delete) | BackSpace Видалення символу на місці курсору | перед курсором Ctrl-k | Ctrl-x BackSpace Видалення до кінця | початку лінії Ctrl-y Вставка останнього віддаленого фрагмента

[ правити ] Історія команд

Всі команди, введені користувачем в інтерпретаторі bash, зберігаються. Перелік раніше введених команд називається історією. Після того як натискається клавіша Enter, команда записується в історію. Якщо при цьому розмір списку історії занадто великий (максимальний розмір визначається змінною HISTSIZE), перша команда з нього віддаляється. При завершенні роботи bash історія зберігається в файлі, а на початку його роботи - відновлюється.

Якщо команда раніше була введена, її можна не вводити повністю, а просто вибрати зі списку історії. Найбільш прості команди для пересування за списком історії: клавіші вгору і вниз для переходу відповідно до попереднього і наступного елементу історії. [Застереження] Застереження

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

Комбінації клавіш для управління історією.

вгору

Витягти попередню команду зі списку історії і пересунутися на одну команду назад вниз Витягти наступну команду зі списку історії і пересунутися на одну команду вперед Page Up Перейти до початку списку історії і витягти першу введену команду Page Down Перейти до кінця списку історії, тобто до рядка, яка зараз редагується Ctrl-r Зворотний пошук в історії. Проглядаються всі рядки, починаючи з останньої, і порівнюються з шуканим текстом. Якщо вам потрібно повторити пошук (знайти наступний примірник), треба натиснути ctrl-r ще раз. Ctrl-s Прямий пошук в історії. Проглядаються всі рядки, починаючи з першої, і порівнюються з шуканим текстом (за замовчуванням ctrl-s це клавіша flow-control, яка просто заморожує консоль; відключити можна, так: stty stop '') Meta-Ctrl-y Вставити перший аргумент останньої введеної команди (друге слово в рядку) Meta-. Вставити останній аргумент останньої введеної команди (останньої слово в рядку) Ctrl-o Прийняти на виконання введений рядок і перейти до наступної команді в списку історії (при натисканні Enter здійснюється перехід в кінець списку)

[ правити ] автоматичне продовження

Автоматичне продовження (автодоповнення, автозавершення - англ. Autocompletion) є надзвичайно зручною здатністю bash. Після того як набрані перші символи імені, натискання клавіші Tab змушує bash показати можливі варіанти закінчення набраного слова. Якщо варіант тільки один, bash використовує його і автоматично завершує слово. Якщо варіантів декілька, bash виводить їх все на екран. Якщо варіантів занадто багато, bash попередньо запитає, чи варто виводити їх все? Нарешті, якщо варіанти завершення слова відсутні, bash видасть звуковий сигнал. Це хороший привід подумати про те, що при наборі слова, ймовірно, вже допущена помилка.

За замовчуванням bash автопродолжает назви команд, імена файлів, а при використанні на початку імені спеціальних символів ще й імена користувачів (~), назва хостів (@) і імена змінних ($).

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

При автозавершенням імені файлу проглядається поточний каталог. Якщо в завершує імені вказано ще й шлях, то замість поточного каталогу проглядається каталог, який визначається цим шляхом. При вказівці шляху в імені файлу діє те ж правило.

При вказівці шляху в імені файлу діє те ж правило

Існує додаткова надбудова над bash: bash_completion , Яка дозволяє виконувати автоматичне продовження не тільки імен файлів і команд, а й усіляких аргументів команди, грунтуючись на контексті автоматичного продовження.

[ правити ] Приклад. Автоматичне продовження в bash

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

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

[I @ core i] $ fi1 fi find finger 2 fifteen_applet find2perl fitstopnm file findrpm fix_bs_and_del file_by_inode findsmb file-types-capplet findtr [i @ core i] $ fin3 find find2perl findrpm findsmb findtr finger4 [i @ core i] $ find5 / u6sr / 7s8 sbin share src [i @ core i] $ find / usr / sh9are / 10d dia dict doc [i @ core i] $ find / usr / share / doc / -name '* bash *' / usr / share / doc /lynx-2.8.4/lynx_help/keystrokes/bashlike_edit_help.html /usr/share/doc/bash-2.05 [i @ core i] $

Набравши fi, користувач натискає Tab 1. Є кілька варіантів автоматичного продовження 2. Він набирає ще одну букву і натискає Tab 3 ще раз. Варіантів все ще багато 4. Він набирає останню букву 5. Тепер він може бути впевнений, що команда набрана правильно (якщо це взагалі та команда, яка йому потрібна). Після цього він починає набирати ім'я каталогу: / u і натискає Tab 6; ім'я автоматично продовжується до / usr / - інших варіантів немає 7. Користувач натискає s і Tab 8 - варіантів декілька; він вибирає те, що здається йому найкращим і натискає h і Tab 9. Ім'я триває до / usr / share / 10. Продовжуючи діяти в тому ж дусі, він набирає ім'я каталогу документації / usr / share / doc. Далі він вручну набирає залишок команди і передає їй виконання.

[ правити ] Обробка командного рядка

Після того як користувач ввів команду і натиснув Enter для запуску, bash починає її обробку.

Обробка команди виробляється в кілька етапів:

  1. Розкриття дужок;
  2. Заміна тильди;
  3. Підстановка змінних і параметрів;
  4. Командна підстановка;
  5. розбиття;
  6. Заміна шаблонів.

Порядок проведення етапів обробки командного рядка важливий.

[ правити ] Файлові шаблони

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

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

Шаблонні символи.

*

Будь-яка послідовність символів або порожня послідовність. ? Один будь-який символ. [] Символьний клас. Один з тих символів, які перераховані в квадратних дужках. Якщо першим символом є циркумфлекс ^, навпаки - будь-який із символів, що не перераховані в дужках. Може бути вказано діапазон символів, наприклад ae означає abcde.

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

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

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

Заміна відбувається так: bash послідовно переглядає список всіх файлів що знаходяться в каталозі. Якщо ім'я файлу задовольняє вимогам шаблону, він запам'ятовується, в іншому випадку відкидається. Потім розглядається ім'я наступного файлу. Каталог, файли якого перевіряються на відповідність шаблону, визначається колійним ім'ям попереднім безпосередньо шаблоном. Якщо імені немає - розглядається поточний каталог. Розкриття шаблону відбувається рекурсивно, тобто якщо кілька частин колійного імені містять шаблонні символи, тоді спочатку розкривається перше з них, потім для кожного отриманого імені розкривається другий шаблон і т.д.

[ правити ] Приклад. файлові шаблони

Ось кілька простих прикладів: всі файли в поточному каталозі 1, всі файли, що завершуються на .xml - файли з суфіксом .xml 2, всі файли, що починаються на точку - приховані файли 3.

* 1 * .xml 2. * 3

А ось кілька прикладів складніше. Всі файли з суфіксом .xml у всіх підкаталогах першого рівня каталогу / home / i / xml 1. Всі файли і підкаталоги другого рівня, що містять слово linux 2. Всі файли в поточному каталозі, які містять в своєму імені символ '-', '+ ',' * '(!) або' = '3.

/home/i/xml/*/*.xml 1 / * / * linux * 2 / * [- + * =] * 3

[ правити ] Фігурні дужки

Командний інтерпретатор bash надає ще один засіб для опису символьних послідовностей. Воно відрізняється від шаблонів тим, що дозволяє описувати імена неіснуючих файлів або каталогів. Такий механізм є дуже зручним при створенні групи файлів або каталогів зі схожими назвами. Цей механізм відомий як Дужковий підстановка або розкриття фігурних дужок.

Дужковий шаблон має наступний вигляд:

Префікс {рядок1, рядок2, ...} Суфікс

Після розкриття дужок генерується послідовність рядків:

ПрефіксСтрока1Суффікс ПрефіксСтрока2Суффікс ...

Дужки можуть бути вкладеними. У цьому випадку вони розкриваються рекурсивно.

[ правити ] Приклад. Дужковий підстановка

Створити каталоги 1999, 2000, 2001 і 2002, кожен з яких містить 12 підкаталогів відповідних місяцях (01, 02, ..).

$ Mkdir -p {1999,200 {0,1,2}} / {0 {1,2,3,4,5,6,7,8,9}, 1 {0,1,2}}

Створити розгорнуте дерево каталогів при використанні скобочной підстановки можна однією командою:

$ Mkdir -pa / {b / {c, d}, e / {f, g, h / i / j / k}} $ tree. `- a | - b | | - c | `- d` - e | - f | - g `- h` - i `- j` - k 11 directories, 0 files

Команда створює дерево в поточному каталозі:

[ правити ] Командна підстановка

Буває, що в якості аргументу однієї команди необхідно використовувати інформацію, отриману в результаті виконання іншої команди. Можна виконати першу команду, запам'ятати або записати результати її роботи, а потім викликати другу команду, вручну вказавши отримані параметри. Цей спосіб є, як мінімум, незручним. Іноді він може бути взагалі непридатний - наприклад, якщо кількість параметрів велике або програма викликається неодноразово. Для вирішення цієї проблеми, командний інтерпретатор bash надає особливий механізм, званий командної підстановкою.

$ (Команда)

або

`команда`

При підстановці команда виконується, а видані результати автоматично підставляються на її місце. Командна підстановка може бути вкладеною. Для цього потрібно використовувати форму $ () або екранувати внутрішні лапки `` за допомогою символів \ [1] .

Для вирішення схожих завдань може використовуватися команда xargs, яка будує і викликає командний рядок на основі даних, що надходять на стандартний потік введення.

[ правити ] Приклад. командна підстановка

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

$ Touch `cat files`

Командний інтерпретатор надає іншій - більш швидкий - спосіб запису конструкції `cat файл`: вона має вигляд` <файл`. Вищенаведений приклад виглядає так:

$ Touch `<users`

Ось приклад більш цікавий. Вивести розмір всіх файлів в домашньому каталозі, до яких не було доступу останні 5 днів.

$ Du `find ~ -atime 5`

Розглянемо цей приклад більш докладно. Команда du повідомляє розмір всіх файлів, перерахованих в якості її параметрів. Команда find виводить список всіх файлів, що знаходяться в каталозі ~ (домашньому каталозі), до яких не було доступу останні 24 * 5 = 120 годин. Після командної підстановки виходить, що параметрами команда du є імена всіх файлів, до яких не було доступу останні 5 діб.

Ще один приклад з командою find. Видалення з домашнього каталогу всіх файлів core, що створюються при краху програм:

$ Rm -f `find ~ -name core`

[ правити ] Підстановка змінних і параметрів

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

У тих випадках, коли інтерпретатору складно самостійно визначити межі імені змінної, використовується спеціальна форма запису $ {ім'я}.

Інтерпретатор bash підтримує кілька додаткових конструкцій, що підвищують гнучкість і зручність підстановки параметрів в певних випадках:

Якщо відсутня двокрапка <:>, виконується перевірка тільки на те, чи існує змінна. Чи є змінна порожній чи ні не має значення.

$ {ім'я:-значення}

Використовувати значення за замовчуванням. Якщо змінна ім'я невідома або порожня, підставляється значення, інакше значення змінної ім'я; $ {ім'я: = значення} Присвоїти значення за замовчуванням. Аналогічна попередньому, але тільки в тому випадку, якщо ім'я не визначено, змінної ім'я присвоюється значення. $ {м'я:? значення} Видати помилку, якщо змінна не визначена. Якщо ім'я не визначено, повідомити про помилку на стандартний потік помилок. Як тексту повідомлення використовувати значення. $ {ім'я: + значення} Використовувати альтернативне значення. Якщо ім'я визначено, нічого не підставляється (конструкція видаляється). Інакше, підставляється значення. $ {ім'я: зсув} $ {ім'я: зміщення: довжина} Підстановка підрядка. Підставляється подстрока змінної ім'я, починаючи з позиції зміщення. Якщо задана довжина, то підставляється відповідну кількість символів, інакше рядок до кінця. $ {! префікс *} підставляти імена всіх змінних, які починаються на задану послідовність префікс. $ {# ім'я} Кількість символів в значенні змінної ім'я. Якщо ім'я - масив, то підставляється кількість елементів масиву.

[ правити ] Заміна тильди

У Linux символ ~ означає домашній каталог користувача. Інтерпретатор bash йде далі і розвиває цю ідею. Слово разом з попередньої йому тильдой ~ ім'я, замінюється на ім'я домашнього каталогу користувача під назвою ім'я (~ i стає / home / i, де / home / i - домашній каталог користувача i).

Символи ~ + означають вміст змінної оточення PWD (поточний каталог), а ~ - - вміст змінної оточення OLDPWD, тобто каталогу, в якому користувач знаходився до того, як перейшов в поточний каталог. Символи ~ + і ~ - можна вказувати з додатковими чисельними параметрами, які означають глибину переходу по стеку каталогів (див. Bash (1) / pushd).

[ правити ] Арифметична підстановка

Арифметична підстановка дозволяє обчислити арифметичне вираз і підставити на його місце результат.

$ ((Арифметичний вираз))

Усередині арифметичного виразу можуть бути використані інші підстановки. Арифметичні вирази можуть бути вкладеними.

[ правити ] Приклад. арифметична підстановка

Ось трохи наївний приклад підрахунку кількості користувачів системи, у яких немає домашніх каталогів:

$ Echo $ (( `cat / etc / passwd | wc -l` -` ls / home | wc -w`))

Кількість рядків у файлі / etc / passwd, дорівнює кількості користувачів системи, мінус кількість слів у лістингу каталогу / home, яке має дорівнювати кількості домашніх каталогів користувачів.

Для арифметичної підстановки є ще конструкція $ [...], але вона вважається нестандартною, підтримується не всіма інтерпретаторами, і її краще не використовувати [2] .

[ правити ] Екранування і лапки

Ці теми не розкриті: Написати про те, які лапки бувають, чим вони відрізняються, як і де їх використовувати, як можна екранувати самі лапки [3] .

[ правити ] Перенаправлення і канали

Головна сторінка: Стандартні потоки вводу / виводу

[ правити ] Перенаправлення

Процес взаємодії з користувачем виконується в термінах запису і читання в файл. Тобто висновок на екран видається як запис в файл, а введення - як читання файлу. Файл, з якого здійснюється читання, називається стандартним потоком введення, а в який здійснюється запис - стандартним потоком виводу. [Примітка] Примітка

Стандартні потоки - уявні файли, що дозволяють здійснювати взаємодію з користувачем (читання і запис в файл).

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

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

Оператори перенаправлення в bash.

<файл

Використовувати файл як джерело даних для стандартного потоку введення. > файл Направити стандартний потік виведення в файл. Якщо файл не існує, він буде створений; якщо існує - перезаписан зверху. 2> файл Направити стандартний потік помилок в файл. Якщо файл не існує, він буде створений; якщо існує - перезаписан зверху. >> файл Направити стандартний потік виведення в файл. Якщо файл не існує, він буде створений; якщо існує - дані будуть дописані до нього в кінець. 2 >> файл Направити стандартний потік помилок в файл. Якщо файл не існує, він буде створений; якщо існує - дані будуть дописані до нього в кінець. &> файл або> & файл Направити стандартний потік виведення і стандартний потік помилок в файл. Інша форма запису:> файл 2> & 1.

[ правити ] Приклад. перенаправлення

Ця команда об'єднує три файли: header, body і footer в один файл letter:

$ Cat header body footer> letter

Команда cat по черзі виводить вміст файлів, перерахованих в якості параметрів на стандартний потік виведення. Стандартний потік виводу перенаправлений в файл letter.

Тут використовується відразу перенаправлення стандартного потоку введення і стандартного потоку виводу:

$ Sort <unsortedlines> sortedlines

Програма sort сортує дані, що надійшли в стандартний потік введення, і виводить їх на стандартний потік виведення. Стандартний потік введення підключений до файлу unsortedlines, а вихід записується в sortedlines.

Тут перенаправлені потоки виведення і помилок:

$ Find / home -name '* .rpm'> rpmlist 2> / dev / null

Програма find шукає в каталозі / home файли з суфіксом .rpm. Список знайдених файлів записується в файл rpmlist. Всі повідомлення про помилки видаляються. Видалення досягається за допомогою перенаправлення потоку помилок на пристрій / dev / null - спеціальний фіктивний файл, що означає ніщо. Дані, надіслані туди, безповоротно зникають.

[ правити ] Канали

Стандартні потоки можна перенаправляти не тільки в файли, але і на вхід інших програм. Якщо потік виведення однієї програми з'єднати з потоком введення іншої програми, вийде конструкція, звана каналом або трубопроводом (від англ. Pipe).

В bash канал виглядає як послідовність команд, відокремлених один від одного символом |:

команда1 | команда2 | команда3 ...

Стандартний потік виводу команди1 підключається до стандартного потоку введення команди 2, стандартний потік виведення команди 2 в свою чергу підключається до потоку введення команди3 і т.д.

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

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

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

Можна створювати відгалуження в каналах. Команда tee дозволяє зберігати дані, що передаються в каналі:

tee [опції] файл ...

Програма tee копіює дані, що надходять на стандартний потік введення, в зазначені в якості аргументів команди файли, і передає дані на стандартний потік виведення.

[ правити ] Канали

Приклад: сортується файл unsortedlines і результат записується в sortedlines.

$ Cat unsortedlines | sort> sortedlines

Команда виконує ті ж дії, але запис є більш наочною.

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

$ Du -s / home / * 1 | sort -nr2 | head -13

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

Ключ -n команди sort означає, що сортування має бути арифметичної, тобто рядки повинні розглядатися як числа, а не як послідовності символів (Наприклад, 12> 5 в той час як рядок '12' < '5' тому що порівняння рядків виробляється посимвольний і '1' < '5'). Ключ -r означає зміни порядку сортування - з зростаючого на спадаючий.

Команда head виводить кілька перших рядків надходить на її вхід потоку, відкидаючи всі інші. Ключ -1 означає, що треба вивести тільки один рядок.

Таким чином, список власних каталогів з їх сумарним об'ємом 1 арифметично сортується за зменшенням 2 і з отриманого списку береться перший рядок 3, тобто рядок з найбільшим числом, що відповідає самому об'ємному каталогу.

Використання команди tee:

$ Sort text | tee sorted_text | head -n 1

Вміст файлу text сортується, і результат сортування записується в файл sorted_text. Перший рядок відсортованого тексту видається на екран.

[ правити ] Програми-фільтри

Ці теми не розкриті: Написати про те, що таке програма фільтр і які основні програми-фільтри використовуються в UNIX

Ці теми не розкриті: Написати про test і про командні дужки, а також про код завершення

[ правити ] Послідовності команд і командні конструкції

Ці теми не розкриті: Написати про &&,

[ правити ] Питання та відповіді

[ правити ] Як подивитися поточну прив'язку комбінацій клавіш до дій?

bind -p

[ правити ] Додаткова інформація

Робота з аргументами командного рядка:

  1. Тонкощі використання командної підстановки: http://wiki.bash-hackers.org/syntax/expansion/cmdsubst
  2. https://groups.google.com/forum/?fromgroups#!topic/gnu.bash.bug/HoPd5I2Zqzk%5B1-25%5D про те чому $ (()) краще ніж $ []
  3. http://wiki.bash-hackers.org/syntax/quoting (Англ.) - докладно про лапках
Ru Короткий URL: shell [ правити ] Що таке командний інтерпретатор?
Ru Короткий URL: shell [ правити ] Що таке командний інтерпретатор?
Як працює командний інтерпретатор?
Якщо варіантів занадто багато, bash попередньо запитає, чи варто виводити їх все?
?м'я:?
Com/forum/?