Вивчення команд командного інтерпретатора bash в ос linux. Використання інтерпретатора ash. cd та домашня директорія користувача

У більшості операційних систем Linux bash є прийнятим за умовчанням інтерпретатором командного рядка. Щоб визначити поточний інтерпретатор, введіть наступну команду:

$ echo $SHELL
/bin/bash

У цьому прикладі використовуєтьсяінтерпретатор командного рядка bash. Існує багато інших командних інтерпретаторів. Для активізації іншого інтерпретатора можна ввести його ім'я у командному рядку (ksh, tcsh, csh, sh, bash тощо).

У більшості повнофункціональних операційних систем Linux надаються на замітку всі описані тут командні інтерпретатори. Але в невеликих операційні системиможуть бути надані один або два інтерпретатори.

Перевірка доступності цікавогоінтерпретаторакомандного рядка

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

Існує кілька причин вибору альтернативних командних інтерпретаторів.

  • Звичка працювати в системах UNIX System V (у багатьох із них за замовчуванням застосовуються інтерпретатор ksh) або в системах компанії Sun Microsystems та інших системах на базі Berkeley UNIX (у них часто використовується csh). У такому разі застосування цих інтерпретаторівкомандного рядкавиявиться зручнішим.
  • Необхідність запуску сценаріїв, які створювалися певного командного інтерпретатора.
  • Можливості альтернативного командного інтерпретатора можуть виявитися кращими. Наприклад, один із членів групи користувачів Linux вважає за краще застосовувати ksh, тому що його не влаштовує спосіб створення псевдонімів у bash.

Хоча більшість користувачів воліють працювати в одному командному інтерпретаторі, отримані навички допомагають навчитися працювати і в іншихінтерпретаторів командного рядка , зрідка заглядаючи до довідкового посібника (наприклад, за допомогою команди manbash). Більшість використовують bash, тому що немає причин переходити на інший інтерпретатор.

Використання Bash та ch

Назва bash є абревіатурою від Bourne Again SHell. Ця абревіатура свідчить про те, що bash успадковує інтерпретатор Bourneshell (команда sh), створений Стівом Борном (Steve Bourne) з AT&TBell Labs. Браян Фокс (Brian Fox) з Free Software Foundationстворив bash у складі проекту GNU. Надалі розробка перейшла до рук Чета Рамі (Chet Ramey) у Case Western Reserve University.

Інтерпретатор bash містить можливості, які розроблялися для інтерпретаторів sh і ksh за часів ранніх версій UNIX, і навіть ряд можливостей інтерпретатора csh.

Можна розраховувати, що в більшості систем Linux, крім спеціалізованих (наприклад, що вбудовуються або завантажуються з зовнішнього диска), інтерпретатор bash застосовується за умовчанням. У спеціалізованих системах може знадобитися командний інтерпретатор меншого обсягу, що передбачає обмеження можливостей.

Більшість прикладів у ційстаттірозраховано використання bash.

Інтерпретатор bash може запускатись у різних режимах сумісності, імітуючи поведінку інших командних інтерпретаторів. Він може імітувати поведінку Bourne shell (sh) або командного інтерпретатора, сумісного зі стандартами POSK (bashposix).

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

Всі операційні системи Linux, що надаються, за замовчуванням використовують інтерпретатор bash, крім операційних систем, що завантажуються зі змінних носіїв, в яких за замовчуванням застосовується інтерпретатор ash.

Використання tcsh (і раннього інтерпретатора csh)

Командний інтерпретатор tcsh є реалізацією інтерпретатора Сshell (csh) з відкритим вихідним кодом. Інтерпретатор csh був створений Біллом Джоєм (Bill Joy) і використовується за умовчанням практично у всіх системах Berkeley UNIX (такі системи розповсюджувалися компанією Sun Microsystems).

Багато можливостей csh, наприклад редагування командного рядка та методи управління історією команд, були реалізовані в інтерпретаторі tcsh та інших командних інтерпретаторах. Як команда sh запускає інтерпретатор bash як сумісності з інтерпретатором sh, команда csh запускає інтерпретатор tcsh як сумісності з інтерпретатором csh.

Використання інтерпретатора ash

Інтерпретатор ASH є полегшеною версією інтерпретатора Berkeley UNIX sh. Він не містить багатьох базових функцій і не надає таких можливостей як історія команд.

Інтерпретатор ash добре підходить для застосування у системах, що вбудовуються з обмеженими системними ресурсами. В операційній системі FedoraCore 4 інтерпретатор ash на порядок менший за інтерпретатор bash.

Використання zsh

Інтерпретатор sh є ще одним клоном інтерпретатора sh. Він відповідає вимогам стандарту POSIX (як і bash), але має інші можливості, включаючи перевірку орфографії та інший підхід до редагування командного рядка. Інтерпретатор zsh використовувався за замовчуванням у перших операційних системах MacOS X, але в сучасних системах за умовчанням застосовується інтерпретатор bash.

У цьому розділі описуються такі теми:

  • Взаємодія з командними інтерпретаторами та командами
  • Команди та послідовності команд
  • Визначення, використання та експорт змінних оточення
  • Історія команд та засоби редагування
  • Запуск команд, що знаходяться в змінній оточенні PATH, так і поза нею
  • Використання підстановки команд
  • Застосування команд рекурсивно до дерева каталогів
  • Використання man-сторінок (допомоги) для пошуку інформації про команди

Цей розділ дає опис деяких основних можливостей командного інтерпретатора bash. Особливий акцент робиться на можливостях, необхідних сертифікації. Командний інтерпретатор це багате середовище, і ми вітаємо його подальше самостійне вивчення. За командними інтерпретаторами UNIX та Linux написано багато книг та bash зокрема.

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

Інтерпретатор bashодин із кількох інтерпретаторів, доступних у Linux. Також він називається B ourne- a gain sh ell, на честь Стівена Борна, творця ранньої версії інтерпретатора ( /bin/sh). Bash по суті сумісний з sh, але представляє багато покращень, як у функціональному плані, так і можливостям програмування. Він включає можливості інтерпретаторів Korn (ksh) та C (csh), і розробляється як POSIX-сумісний інтерпретатор.

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

Інтерпретатори містять вбудованікоманди, такі як cd, break та exec. Інші команди є зовнішніми.

Інтерпретатори також використовують три стандартні потокувведення/виведення:

  • stdinце стандартний потіквведеннящо забезпечує введення для команд.
  • stdoutце стандартний потік виведення, що забезпечує відображення результатів виконання команди у вікні терміналу.
  • stderrце стандартний потік помилок, який відображає помилки, що виникають під час роботи команд.

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

Якщо ви використовуєте Linux систему без графічного інтерфейсуабо ж ви відкрили вікно терміналу в графічному режимі, побачите запрошення для введення команд як у Лістингу 1.

Лістинг 1. Приклади типових запрошень користувача

$
ian@lyrebird:~>
$

Якщо ви зайдете як користувач root (або суперкористувач), ваше запрошення може випрасувати, як показано в Лістингу 2.

Лістинг 2. Приклади запрошень для користувача root або суперкористувача

#
lyrebird:~ #
#

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

Деякі угоди цього посібника

Посібники developerWorks з іспитів LPI 101 і 102 включають код прикладів із реальних Linux систем, з використанням за промовчанням для цих систем. У нашому випадку запрошення користувача root починається з #, тому ви можете відрізнити його від запрошень звичайних користувачів, які починаються зі знака $. Ця угода збігається з тим, що використовується у книгах з цього предмету. Уважно дивіться запрошення командного інтерпретатора у кожному прикладі.

Команди та послідовності

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

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

Команда Echo

Команда echo виводить на термінал список своїх аргументів, як показано в Лістингу 3.

Лістинг 3. Приклади команди echo

$ echo Слово
Слово
$ echo І пропозиція
І пропозиція
$ echo Куди поділися прогалини?
Куди поділися прогалини?
$ echo "А ось і прогалини." # та коментар
А ось і прогалини.

У третьому прикладі Лістингу 3 всі проміжки між словами на виході команди стали одного розміру в один пробіл. Щоб цього уникнути, вам потрібно буде укласти рядок у лапки, використовуючи або подвійні лапки (“) або одинарні (‘). Bash використовує символи роздільники, як пробіли, символи табуляції та символи нового рядка для розбиття вхідного рядка на токени, які потім передаються вашій команді. Укладання рядка в лапки пригнічує її поділ і таким чином вона є єдиним токеном. У наведеному вище прикладі кожен токен після імені команди є параметром, таким чином, у нас виходить відповідно 1, 2, 4 та 1 параметр.

Команда echo має кілька опцій. Зазвичай echo додає після свого виведення символ нового рядка. Використовуйте -n щоб вона не додавала символ нового рядка. Використовуйте -e, щоб команда інтерпретувала escape-послідовності.

Escape-послідовності та перенесення рядка

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

Щоб послідовності, описані вище, правильно оброблялися командою echo або однією з багатьох інших команд, які використовують схожі escape символи управління, ви повинні укласти escape послідовності в лапки або ж включити їх у рядок, укладений в лапки, або використовувати ще один зворотний сліш для правильної інтерпретація символи. Лістинг 4 містить приклади різних варіантіввикористання \.

Лістинг 4. Приклади використання echo

$ echo -n Немає нового рядка
Немає нового рядка$ echo -e "Немає нового рядка\c"
Немає нового рядка$ echo "Рядок у якому натиснули
> клавішу Enter"
Рядок у якій натиснули
клавішу Enter
$ echo -e "Рядок з escape символом\nнового рядка"
Рядок з escape символом
нового рядка
$ echo "Рядок з escape символом\nнового рядка, але без опції -e"
Рядок з escape символом нового рядка, але без опції -e
$ echo -e Метасимволи з подвійним \\n\\tзворотним слешем
Метасимволи з подвійним
зворотним слішем
$ echo Зворотній сліш \
> за яким слідує Enter \
> служить як запит на продовження рядка.
Зворотний сліш за яким слідує Enter служить як запит на продовження рядка.

Зауважимо, що bash відображає спеціальне запрошення (>), коли ви набрали рядок із незавершеними лапками. Ваш вхідний рядок переноситься на другий рядок і містить символ нового рядка.

Метасимволи Bash та оператори управління

Bash включає кілька символів, які, будучи не укладеними в лапки, також служать розділення вхідного рядка на слова. Крім пробілу такими символами є '|', '&', ';', '(', ')', '<’, и ‘>'. Деякі з цих символів ми більш детально обговоримо в інших розділах цього посібника. А зараз зауважимо, що якщо ви хочете включити метасимвол як частину вашого тексту, то він повинен бути укладений у лапки або йому повинен передувати зворотний слєш (\) як у Лістингу 4.

Новий рядок та відповідні метасимволи або пари метасимволів також служать як оператори керування. Такими символами є '||', '&&', '&', ';', ';;', '| '(', і ')'. Деякі з цих операторів керування дозволяють створювати послідовності або списки команд.

Найпростіша послідовність команд і двох команд, розділених точкою з комою (;). Кожна наступна команда виконується після попередньої. У будь-якому середовищі програмування команди повертають код, що свідчить про нормальне чи невдале завершення програми; команди Linux зазвичай повертають 0 у разі успішного завершення та ненульове значення у разі неуспіху. Ви можете здійснювати обробку за умовою, використовуючи оператори && та ||. Якщо ви розділите дві команди керуючим оператором &&, то друга команда виконуватиметься лише в тому випадку, якщо перша повернула на виході нуль. Якщо ви розділили команди за допомогою ||, друга команда буде виконуватися, тільки якщо перша повернула ненульове значення. Лістинг містить 5 деякі послідовності команд з використанням команди echo. Ці приклади не дуже цікаві, тому що echo повертає 0, але ми розглянемо більше прикладів, коли навчимося використовувати більша кількістькоманд.

Лістинг 5. Послідовності команд

$ echo line 1; echo line 2; echo line 3
line 1
line 2
line 3
$ echo line 1&&echo line 2&&echo line 3
line 1
line 2
line 3
$ echo line 1||echo line 2; echo line 3
line 1
line 3

Ви можете вийти з інтерпретатора за допомогою команди exit. Додатково як параметр ви можете задати код виходу. Якщо ви працюєте з командним інтерпретатором у термінальному вікні у графічному режимі, то в цьому випадку воно просто закриється. Аналогічно, якщо ви під'єднані до віддаленої системи за допомогою ssh або telnet (наприклад), з'єднання завершиться. В інтерпретаторі bash ви також можете натиснути клавішу Ctrlта d для виходу.

Давайте розглянемо ще один оператор керування. Якщо ви поставите команду або список команд у круглі дужки, то команда або послідовність команд виконуватиметься у своїй копії командного інтерпретатора, таким чином, команда exit виходить із копії командного інтерпретатора, а не з того інтерпретатора, в якому ви працюєте на даний момент. Лістинг 6 містить прості прикладиспільно з використанням && та ||.

Лістинг 6. Командні інтерпретатори та послідовності команд

$ (echo У копії інтерпретатора; exit 0) && echo OK || echo Bad exit
У копії інтерпретатора
OK
$ (echo У копії інтерпретатора; exit 4) && echo OK || echo Bad exit
У копії інтерпретатора
Bad exit

Залишайтеся з нами та дізнайтеся про інші команди в цьому посібнику.

Змінні оточення

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

Як у змінних оточення, і у змінних оболонки є ім'я. Посилатися значення змінної можна, поставивши перед ім'ям змінної знак ‘$’. Деякі найбільш загальні змінні середовища bash наведені у Таблиці 4.

  • USERІм'я користувача, що зайшов у систему
  • UIDЦифровий ідентифікатор користувача, що зайшов у систему користувача
  • HOMEДомашній каталог користувача
  • PWDПоточний робочий каталог
  • SHELLІм'я командного інтерпретатора
  • $ Ідентифікатор процесу (або PID) bash (або іншого) процесу
  • PPIDІдентифікатор процесу, що породив даний процес(тобто ідентифікатор батьківського процесу)
  • ? Код виходу останньої команди

На Лістингу 7 можна побачити деякі змінні bash.

Лістинг 7. Змінні середовища та shell

$ echo $USER $UID
ian 500
$ echo $SHELL $HOME $PWD
/bin/bash /home/ian /home/ian
$(exit 0);echo $?;(exit 4);echo $?
0
4
$ echo $$ $PPID
30576 30575

Ви можете створити або встановити змінну оболонки, набравши відразу за ім'ям змінної знак (=). Змінні чутливі до регістру, таким чином, var1 та VAR1 – це дві різні змінні. За згодою змінні, особливо експортовані змінні, пишуться в верхньому регістріале це не обов'язкова вимога. Формально $$ і $? є параметрами оболонки, а чи не змінними. Ви можете на них посилатися, але не надавати значення.

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

Щоб проілюструвати привласнення та експорт, створимо ще один bash з поточного bash інтерпретатора, а потім запустимо інтерпретатор Korn (ksh) створеного bash. Ми будемо використовувати команду ps для відображення інформації про працюючі процеси. Більш детально про команду ps ми дізнаємося, коли вивчимо поняття статусу процесу далі в цьому посібнику.

Чи не використовуєте bash?

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

  • Використовуйте команду
    chsh -s /bin/bash
    щоб змінити інтерпретатор за промовчанням. Зміни набудуть чинності під час наступного заходу в систему.
  • Команда
    su - $USER -s /bin/bash
    створить інший процес, який буде дочірнім по відношенню до вашого поточного інтерпретатора. Новий процес запустить процес входу до системи з командним інтерпретатором bash.
  • Створіть користувача з командним інтерпретатором bash для приготування до складання іспиту LPI.

Лістинг 8. Змінні середовища та shell

$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
30576 30575 -bash
$ bash

PID PPID CMD
16353 30576 bash
$VAR1=var1
$VAR2=var2
$ export VAR2
$ export VAR3=var3
$VAR2 $VAR3
var1 var2 var3
$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
$ksh
$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
16448 16353 ksh
$ export VAR4=var4
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit
$ $ echo $ VAR1 $ VAR2 $ VAR3 $ VAR4 $ SHELL
var1 var2 var3 /bin/bash
$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
16353 30576 bash
$ exit
$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
30576 30575 -bash
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash

Примітка:

  1. На початку цієї послідовності у інтерпретатора bash був PID 30576.
  2. У другого інтерпретатора bash PID 16353, яке батьківський PID 30576, тобто початковий bash.
  3. Ми створили змінні VAR1, VAR2 та VAR3 у другому екземплярі bash, але експортували тільки VAR2 та VAR3.
  4. В інтерпретаторі Korn ми створили VAR4. Команда echo відображає значення лише змінних VAR2, VAR3 та VAR4, та підтвердила, що VAR1 не була експортована. Ви не здивувалися, коли значення змінної SHELL не змінилося, хоча змінилося запрошення введення? Ви не можете завжди покладатися на SHELL, щоб визначити в якому інтерпретаторі йде роботаале команда ps дозволить точно визначити, що до чого. Зауважимо, що ps ставить дефіс (-) перед першим екземпляром bash, щоб дати нам зрозуміти, що це вихідний командний інтерпретатор.
  5. У другому примірнику bash ми можемо переглянути VAR1, VAR2 та VAR3.
  6. Нарешті, коли ми повертаємося у вихідний інтерпретатор, жодна змінна у ньому немає.

Раніше ми обговорювали можливість використання лапок як одинарних, так і подвійних. Між ними є суттєва різниця. Інтерпретатор здійснює підстановку shell змінних, що знаходяться між подвійними лапками ($), але не здійснює підстановку, якщо використовуються одинарні ('). У попередньому прикладі ми створили новий екземпляр інтерпретатора з іншого і отримали новий ідентифікатор процесу. Використовуючи опцію -cВи можете передати команду в інший інтерпретатор, який виконає команду та здійснить повернення. Якщо ви передаєте рядок як команду в одинарних лапках, то другий екземпляр інтерпретатора їх зніме та обробить рядок. При використанні подвійних лапок підстановка змінних відбувається до тогояк здійсниться передача рядка, тому результати можуть відрізнятись від того, що ви хотіли очікувати. Інтерпретатор і команда породять процес, який матиме свій PID. Лістинг 9 ілюструє ці концепції. PID початкового інтерпретатора bash виділено іншим шрифтом.

Лістинг 9. Звичайні та shell змінні

$ echo "$SHELL" "$SHELL" "$$" "$$"
/bin/bash $SHELL 19244 $$
$ bash -c "echo Expand in parent $$ $PPID"
Expand in parent 19244 19243
$ bash -c "echo Expand in child $$ $PPID"
Expand in child 19297 19244

Досі всі наші змінні закінчувалися пропуском, таким чином було зрозуміло, де закінчується ім'я змінної. Насправді ім'я змінної може лише складатися з букв, цифр чи символу підкреслення. Інтерпретатор знає, що ім'я змінної закінчується, коли зустрічається інший символ. Іноді необхідно використовувати змінні у виразах, де їхнє значення може бути двозначним. У таких випадках ви можете використовувати фігурні дужки, щоб відокремити ім'я змінної, як показано в Лістингу 10.

Лістинг 10. Використання фігурних дужокз іменами змінних

$ echo "-$HOME/abc-"
-/home/ian/abc-
$ echo "-$HOME_abc-"
--
$ echo "-$(HOME)_abc-"
-/home/ian_abc-

Команда env

Команда env без будь-яких опцій або параметрів відображає поточні змінні середовища. Ви також можете використовувати її, щоб виконати команду в певному середовищі. Опція -i (або просто –) очищає поточне середовище до того, як виконати команду, тоді як опція -u обнуляє змінні середовища, які ви не хочете передавати.

Лістинг 11 містить частковий висновок команди env без будь-яких параметрів, а потім три приклади, що запускають різні інтерпретатори без батьківського середовища. Уважно їх перегляньте перед тим, як ми їх обговоримо.

Лістинг 11. Команда env

$env
HOSTNAME=echidna
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=9.27.89.137 4339 22
SSH_TTY=/dev/pts/2
USER=ian
...
_=/bin/env
OLDPWD=/usr/src
$ env -i bash -c "echo $SHELL; env"
/bin/bash
PWD=/home/ian
SHLVL=1
_=/bin/env
$ env -i ksh -c "echo $SHELL; env"
_=/bin/env
PATH=/bin:/usr/bin
$ env -i tcsh -c "echo $SHELL; env"
SHELL: Undefined variable.

Зауважимо, що bash встановив змінну SHELL, але не експортував її в середу, незважаючи на те, що bash створив серед інших три змінних. У прикладі з ksh ми маємо дві змінні оточення, але наша спроба видати на екран значення змінної SHELL призводить до появи порожнього рядка. Нарешті, tcsh не створив жодних змінних середовища і видав помилку, коли ми спробували отримати значення змінної SHELL.

Встановлення та обнулення змінних

Лістинг 11 показав, як поводяться інтерпретатори при обробці змінних та середовищ. Хоча цей посібник приділяє увагу bash, слід знати, що не всі інтерпретатори поводяться однаково. Понад те, інтерпретатори ведуть себе по-різному залежно від цього, чи є вони вихідними командними інтерпретаторами чи ні. Зараз ми просто скажемо, що вихідний командний інтерпретатор – це інтерпретатор, який ви отримуєте при вході в систему; ви можете запустити інші командні інтерпретатори так, що вони будуть поводитися як вихідні, якщо забажаєте. Три інтерпретатора у прикладі вище, запущені за допомогою команди env -i є вихідними інтерпретаторами. Спробуйте передати опцію -l, щоб побачити різницю під час запуску вихідного командного інтерпретатора.

Давайте розглянемо нашу спробу відобразити значення змінної SHELL у цих командних інтерпретаторах:

  • Коли bash запустився, він встановив змінну SHELL, але не експортував автоматично в середу.
  • Коли запустився ksh, він не встановив змінну SHELL. Однак посилання на невизначену змінну середовища еквівалентне посилання на порожнє значення.
  • Коли запустився tcsh, він не встановив значення змінної SHELL. У цьому випадку стандартна поведінка відрізняється від ksh (і bash) і в результаті згенерувалася помилка, коли ми спробували отримати доступ до змінної.

Ви можете використовувати команду unset для обнулення змінної та видалення її зі списку shell змінних. Якщо змінна була експортована в середу, вона також буде видалена і з середовища. Ви можете використовувати команду set для управління поведінкою bash (або інших інтерпретаторів). Set є вбудованою командою в інтерпретаторі, тому опції залежить від конкретного інтерпретатора. У bash опція -u повідомляє bash, щоб він не генерував помилку при посиланні на невизначені змінні, а працював із ними як із порожніми значеннями. Ви можете додати різні опції до set за допомогою – та вимкнути їх за допомогою +. Ви можете відобразити поточний список параметрів set за допомогою echo $-.

Лістнг 12. Unset та set

$ echo $-
himBH
$ echo $VAR1
$set -u;echo $-
himuBH
$ echo $VAR1
bash: VAR1: unbound variable
$VAR1=v1
$VAR1=v1;echo $VAR1
v1
$ unset VAR1; echo $ VAR1
bash: VAR1: unbound variable
$set +u;echo $VAR1;echo $-
himBH

Ви можете використовувати команду set без будь-яких опцій, яка відображатиме всі ваші shell змінні та їх значення (якщо є). Є також інша команда, declare, за допомогою якої ви можете створювати, експортувати та відображати значення shell змінних. Про інші опції команд set і declare ви можете дізнатись з man-сторінок. Ми розглянемо man-сторінки далі у цьому розділі.

Команда exec

Остання команда, яку ми розглянемо в цьому розділі, це exec. Ви можете використовувати команду exec, щоб запустити іншу команду, яка замістить поточний інтерпретатор. У Лістингу 13 породжується екземпляр bash, а потім використовується exec, щоб замістити його на інтерпретатор Korn. Після виходу з інтерпретатора Korn, ви опиняєтеся у вихідному інтерпретаторі bash (у цьому прикладі PID 22985).

Лістинг 13. Використання exec

$ echo $$
22985
$ bash
$ echo $$
25063
$exec ksh
$ echo $$
25063
$ exit
$ echo $$
22985

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

Якщо ви набирали команди, у міру того, як читали керівництво, то могли помітити, що часто використовуються майже одні й ті ж команди. Хороша новинаполягає в тому, що bash може зберігати історію ваших команд. За замовчуванням історія увімкнена. Ви можете вимкнути її за допомогою команди set+o history та увімкнути за допомогою команди set-o history. Змінне середовище HISTSIZE повідомляє bash про те, скільки треба зберігати рядків. Набір інших властивостей визначає поведінку та роботу історії. Подробиці дивіться у man-сторінках bash.

Якщо ви набирали команди, коли читали керівництво, то могли помітити, що часто використовуються майже одні й ті ж команди. Хороша новина полягає в тому, що bash може зберігати історію ваших команд. За замовчуванням історія увімкнена. Ви можете вимкнути її за допомогою команди set+o history та увімкнути за допомогою команди set-o history. Змінне середовище HISTSIZE повідомляє bash про те, скільки треба зберігати рядків. Набір інших властивостей визначає поведінку та роботу історії. Подробиці дивіться у man-сторінках bash.

Ось деякі команди, які можна використовувати для роботи з історією:

history
Відображає всю історію
historyN
Відображає останні N рядків вашої історії
history -dN
Видаляє рядок N із вашої історії; це можна використовувати, якщо, наприклад, ви хочете видалити рядок, що містить пароль
!!
Ваша остання команда
!N
Nа команда історії
!-N
Команда, віддалена на N кроків від поточної історії (!-1 еквівалентно!!)
!#
Поточна команда, яку ви набираєте
!string
Найновіша команда, яка починається з рядка string
!?string?
Остання команда, що містить рядок string

Ви можете використовувати двокрапку (:), за якою слідує певне значення, щоб отримати доступ або змінити команду в історії. Лістинг 14 показує деякі можливості історії.

Лістинг 14. Управління історією

$ echo $$
22985
$ env -i bash -c "echo $$"
1542
$ !!
env -i bash -c "echo $$"
1555
$!
echo $$
22985
$ !en:s/$$/$PPID/
env -i bash -c "echo $PPID"
22985
$ history 6
1097 echo $$
1098 env -i bash -c "echo $$"
1099 env -i bash -c "echo $$"
1100 echo $$
1101 env -i bash -c "echo $PPID"
1102 history 6
$ history -d1100

Команди в Лістингу 14 роблять наступне:

1. Висновок PID поточного інтерпретатора
2. Запуск команди echo у новому екземплярі інтерпретатора та виведення його PID
3. Запустити останню команду
4. Перезапустити команду, що починається з 'ec'; відбудеться запуск першої команди у цьому прикладі
5. Запустити останню команду, що починається з 'en', але замінити '$PPID' на '$$', тому насправді відобразиться батьківський PID
6. Відобразити останні 6 команд історії
7. Видалити команду під номером 1100, остання команда echo

Можна редагувати історії в інтерактивному режимі. Інтерпретатор bash використовує readline бібліотеку для управління редагуванням команд та історії. За промовчанням клавіші та комбінації клавіш, які використовуються для переміщення по історії або редагування рядків, відповідають тим, що використовуються в редакторі GNU Emacs. Emacs комбінації клавіш зазвичай позначаються як C-x або M-x, де x це звичайна клавіша, а C і M це Control і Meta клавіші відповідно. На типовому PC клавіша Ctrl відповідає клавіші Emacs Control, а клавіша Altвідповідає клавіші Meta. Додаткові функції, а також можливості налаштування опцій за допомогою файлу ініціалізації readline (зазвичай це inputrc у вашому домашньому каталозі) можна знайти у man-сторінках.

Якщо ви хотіли б керувати історією в режимі vi, то використовуйте команду set -o vi, щоб перейти в режим vi. Ви можете перейти назад у режим emacs за допомогою команди set -o emacs. Коли ви виймаєте команду в режимі vi, то спочатку в режимі вставки vi.

Шляхи

Одні команди bash є вбудованими, інші навпаки зовнішніми. Давайте розглянемо зовнішні команди і як їх запускати, а також як відрізнити внутрішню команду.

Де інтерпретатор шукає команди?

Зовнішні команди є файлами у файловій системі. Далі розділ Просте керування файлами цього посібника та посібника для Теми 104 розкривають необхідні подробиці. У системах Linux та UNIX всі файли є частиною величезного дерева, конем якого є /. У наведених вище прикладах нашим поточним каталогом був домашній каталог користувача. У звичайних користувачів домашні каталоги перебувають у /home каталозі, тобто /home/ian, у разі. Домашній каталог root знаходиться у /root. Після того як ви набрали команду, bash шукає її в списку каталогів пошуку за замовчуванням, який представляє собою список каталогів, розділених двокрапкою і PATH, що зберігається в змінній оточенні.

Якщо ви хочете знати, яка команда буде виконана, якщо ви надрукуєте певний рядок, то використовуйте команду which або type. У Лістингу 15 показаний мій шлях за умовчанням, а також розташування кількох команд.

Лістинг 15. Пошук розташування команд

$echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/ian/bin
$ which bash env zip xclock echo set ls
alias ls="ls --color=tty"
/bin/ls
/bin/bash
/bin/env
/usr/bin/zip
/usr/X11R6/bin/xclock
/bin/echo
/usr/bin/which: no set in (/usr/local/bin:/bin:/usr/bin:/usr/X11R6/b
in:/home/ian/bin)
$ type bash env zip xclock echo set ls
bash is /bin/bash
env is /bin/env
zip is /usr/bin/zip
xclock is /usr/X11R6/bin/xclock
echo is a shell builtin
set is a shell builtin
ls is aliased to `ls --color=tty"

Зауважимо, що всі каталоги в дорозі закінчуються /bin. Це загальноприйнята угода, але не вимога. Команда, яка доповіла нам, що команда ls є псевдонімом і що команда set не може бути знайдена. У цьому випадку це можна інтерпретувати, що команди або не існує, або є вбудованою. Команда type повідомила нам, що команда ls насправді є псевдонімом, а також визначила, що команда set є вбудованою командою інтерпретатора; також вона повідомила, що є вбудована команда echo, а також є така команда /bin, яку ми знайшли за допомогою команди which. Ці дві команди по-різному роблять свій висновок.

Ми бачили, що команда ls, яка використовується для перегляду вмісту каталогів, є псевдонімом. Псевдоніми представляють зручний спосіб використання команд з різними наборами опцій або просто для альтернативного іменування команди. У прикладі опція –color=tty змушує підсвічувати список файлів каталогу залежно від типу файлів і каталогів. Спробуйте запустити dircolors –print-database, щоб побачити коди кольорів, а також які кольори використовуються для певного типу файлу.

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

Запуск інших команд

У Лістингу 15 ми бачили, що повний шлях файлів, що виконуються, починається з кореневого каталогу /. Наприклад, xclock це насправді /usr/X11R6/bin/xclock, файл, розташований у каталозі /usr/X11R6/bin. Якщо програма не знаходиться в змінній PATH, то ви можете запустити її, вказавши повний шлях до програми та саму програму. Існує два види шляхів, які ви можете використати:

  • Абсолютні шляхи, які починаються з /, такі як ми бачили в Лістингу 15 (/bin/bash, /bin/env і так далі).
  • Відносні шляхи ці шляхи щодо вашого поточного робочого каталогу, ім'я якого можна отримати за допомогою pwd. Такі команди не починаються з /, але принаймні містять один символ /.

Ви можете використовувати абсолютні шляхинезалежно від вашого поточного робочого каталогу, але ви можете використовувати відносні шляхи, коли команда знаходиться недалеко від поточного каталогу. Припустимо, що ви розробляєте нову версію класичної програми Hello World! у підкаталозі mytestbin вашого домашнього каталогу. Можливо, ви захочете використовувати відносний шлях і запустити команду як mytestbin/hello. Існує два спеціальні імені, які ви можете використовувати у вказівці шляху; проста точка(.) посилається на поточний каталог, і пара точок (..), які посилаються на батьківський каталог поточного каталогу. Так як ваш домашній каталог не знаходиться в змінному оточенні PATH (і так і має бути), то вам знадобиться вказати явний шлях до файлу, який ви хочете запустити зі свого домашнього каталогу. Наприклад, якщо у вас є копія програми hello у вашому домашньому каталозі, для її запуску можете просто використовувати команду./hello. Ви можете використовувати як. так і ... як частина абсолютного шляху, хоча одинарна.не дуже корисна в даному випадку. Ви можете використовувати тильду (~) для посилання на свій домашній каталог і ~usernameдля посилання на домашній каталог користувача username.Деякі приклади наведені в Лістингу 16.

Лістнг 16. Абсолютні та відносні шляхи

$ /bin/echo Use echo command rather than builtin
Use echo command rather than builtin
$ /usr/../bin/echo Include parent dir in path
Include parent dir in path
$ /bin/././echo Add a couple of useless path components
Add a couple of useless path components
$ pwd # See where we are
/home/ian
$ ../../bin/echo Use a relative path to echo
Use a relative path to echo
$ myprogs/hello # Use a relative path with no dots
-bash: myprogs/hello: Немає такого файлу або directory
$ mytestbin/hello # Use a relative path with no dots
Hello World!
$ ./hello # Run program in current directory
Hello World!
$ ~/mytestbin/hello # run hello using ~
Hello World!
$ ../hello # Try running hello від parent
-bash: ../hello: Немає такого файлу або directory

Зміна робочого каталогу

Так само, як ви можете виконувати програми з різних каталогів, ви можете змінювати ваш поточний робочий каталог, використовуючи команду cd. Аргументом для cd має бути абсолютний чи відносний шлях до каталогу. У команді при вказівці шляхів ви також можете використовувати., .., ~, та ~username. Якщо ви наберете CD без параметрів, то перейдете в домашній каталог. Передача як параметр одиночного (-) означає перехід до попереднього робочого каталогу. Домашній каталог зберігається в змінній оточенні HOME, а попередній каталог зберігається в змінній OLDPWD, тому cd еквівалентно cd $HOME, а cd – еквівалентно cd $OLDPWD. Зазвичай ми коротко говоримо про зміну каталогу замість повної зміни поточного робочого каталогу.

Щодо команд, існує змінне середовище CDPATH, яке містить список каталогів, розділених двокрапкою, в яких повинен відбуватися пошук (на додаток до поточного робочого каталогу), при вирішенні відносних шляхів. Якщо рішення використовує шлях CDPATH, то cd надрукує на виході повний шлях знайденого каталогу. Зазвичай вдала зміна каталогу супроводжується появою нового запрошення або трохи модифікованого запрошення. Деякі приклади показані у Лістингу17.

Листнг 17. Зміна каталогів

$ cd /; pwd
$ cd /usr/X11R6;pwd
/usr/X11R6
$ cd; pwd
/home/ian
$ cd -; pwd
/usr/X11R6
/usr/X11R6
$ cd ~ian/..;pwd
/home
$ cd ~; pwd
/home/ian
$ export CDPATH=~
$ cd /; pwd
$ cd mytestbin
/home/ian/mytestbin

Рекурсивне застосування команд

Багато Linux команд можна застосовувати рекурсивно до всіх файлів у дереві каталогів. Наприклад, команда ls має опцію -R для рекурсивної видачі списку каталогів, а команд cp, mv, rm, і diff має опцію -r для рекурсивного застосування.

Підстановка команд

У bash є надзвичайно потужна можливістьпередачі результату однієї програми на вхід іншої; це називається підстановкою команди. Це можна зробити, уклавши команду, результати якої вам потрібні, в апострофи (`). При використанні багатьох вкладених команд можна укладати команду між $(і).

У попередньому посібнику ” LPI 101: Встановлення Linuxта управління пакетами” ми бачили, що команда rpm може сказати якому пакету належить якась команда; тут було зручно застосовувати підстановку команди. Тепер ви знаєте, що ми справді це робили.

Підстановка команди є безцінним інструментом при написанні сценаріїв, а також при використанні командного рядка. У Лістингу 18 показаний приклад, як отримати абсолютний шлях каталогу з відносного, як знайти пакет, який надає команду /bin/echo, і як (будучи root) переглянути мітки трьох розділів на жорсткому диску. Останній використовує команду seq для створення послідовності цілих чисел.

Лістинг 18. Підстановка команди

$ echo "../../usr/bin" dir is $(cd ../../usr/bin;pwd)
../../usr/bin dir is /usr/bin
$ which echo
/bin/echo
$ rpm -qf `which echo`
sh-utils-2.0.12-3
$ su -
Password:
# for n in $ (seq 7 9); do echo p$n `e2label /dev/hda$n`;done
p7 RH73
p8 SUSE81
p9 IMAGES

Man-сторінки

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

Man-сторінки та розділи

Головне (і традиційне) джерело документації - це man-сторінки, доступ до яких можна отримати за допомогою команди man. На Малюнку 1 показано man-сторінку для команди man. Використовуйте команду man man для отримання цієї інформації.

На малюнку 1 представлені деякі типові пункти man-сторінок:

* Заголовок з ім'ям команди, за яким у дужках слідує номер розділу
* Ім'я команди та інші схожі команди, які обговорюються у цій man-сторінці
* Список опцій та параметрів застосовних до команди
* Короткий опискоманди
* Детальний опис кожної опції

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

apropos(1), whatis(1), less(1), groff(1) та man.conf(5).

Зазвичай загальним для man-сторінок є 8 розділів. Більшість сторінок зазвичай ставляться при встановленні пакета, тому якщо пакет не встановлений, то майже напевно у вас відсутні його man-сторінки. Крім того, деякі розділи сторінок можуть бути порожніми або майже порожніми. Найбільш загальні розділи man-сторінок це:

1. Команди користувача (env, ls, echo, mkdir, tty)
2. Системні виклики чи функції ядра (link, sethostname, mkdir)
3. Бібліотечні функції (acosh, asctime, btree, locale, XML::Parser)
4. Інформація з обладнання (isdn_audio, mouse, tty, zero)
5. Опис формату файлів (keymaps, motd, wvdial.conf)
6. Ігри (зауважимо, що багато ігор тепер працюють у графічному режимі, тому можуть мати власну систему допомоги, а не man-сторінки)
7. Різне (arp, boot, regex, unix utf8)
8. Системне адміністрування (debugfs, fdisk, fsck, mount, renice, rpm)

Інші розділи можуть включати 9 для документації по ядру Linux, для нової документації, o для старої документації і l для локальної документації.

Деякі записи можуть зустрічатися у кількох розділах. Наші приклади показали, що mkdir міститься в розділах 1 і 2, а tty у розділах 1 і 4. Ви можете визначити певний розділ, наприклад, man 4 tty або man 2 mkdir, або ви можете використовувати опцію -a для отримання списку всіх розділів man -Сторінок.

Ви помітили, що у man багато опцій, які ви можете самі подивитися. Зараз давайте швидко поглянемо на розділ команд “See also”, які стосуються man.

See also

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

Лістинг 19. Приклади команд whatis та apropos

$ whatis man
man (1) - формат і відтворення on-line manual pages
man (7) - macros to format man pages
man (1) - формат і відтворення on-line manual pages
man.conf (5) - configuration data for man
$ whatis mkdir
mkdir (1) - make directories

$ apropos mkdir
mkdir (1) - make directories
mkdir (2) - create a directory
mkdirhier (1x) - makes a directory hierarchy

Між іншим, якщо ви не можете знайти man-сторінку для man.conf, то спробуйте запустити man man.conf ig .

Виведення на екран команди man здійснює спеціальна програма посторінкового виведення. На більшості Linux систем такою програмою буде less. Іншим варіантом може бути стара програма more. Якщо ви хочете надрукувати сторінку, визначте опцію -t для форматування сторінки та друку, використовуючи програму groff або troff.

У програмі виведення less є кілька команд, що полегшують пошук рядків у тексті, що відображається. Використовуйте команду man less, щоб дізнатися більше про /(пошук вперед), ?(пошук назад) і n (для останнього зробленого пошуку), а також про багато інших команд.

Інші джерела документації

На додаток до man-сторінок, доступних із командного рядка, фонд Free Software Foundation створив велике число info файлів, що обробляються програмою info. Вона має великі можливості навігації, в тому числі і можливість переходу в іншу секцію. Наберіть man info або info info, щоб отримати більше інформації. Не всі команди документовані в info, тому можна використовувати як man-сторінки так і info.

Існує кілька графічних інтерфейсів до man-сторінок, як xman (з проекту XFree86) і yelp (браузер допомоги Gnome 2.0).

Якщо ви не можете знайти довідки про команду, спробуйте запустити команду з опцією –help. Так ви, можливо, дізнаєтеся те, що хотіли або отримаєте підказку, де ще можна пошукати.

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

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

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

Таким чином, командний інтерпретатор- це програма, що має власні вбудовані команди (built-in commands), своє власне змінне оточення (environment), а також дозволяє виконувати зовнішні команди, які присутні в системі.

Оболонка приймає команди, що вводяться користувачем, обробляє, якщо потрібно, їх аргументи, відправляє команди на виконання, приймає значення, що ними повертаються, і виконує певні дії в залежності від цих значень. Крім того, в оболонку вбудовано мову програмування (командна мова), що дозволяє писати складні розгалужені сценарії команд. Саме командна мова відрізняє різні оболонки одна від одної, і саме з неї виходять користувачі, вибираючи оболонки.

Linux є Unix-подібною ОС. Спочатку ОС Linux була розроблена Лінусом Торвальдсом (Linus Torvalds) в Університеті Гельсінкі (Фінляндія) на основі ОС Minix – маленька UNIX-система, створена Andry Tanenbaum. Ранній розвиток Linux перш за все було пов'язане з проблемою перемикання завдань у захищеному режимі для 80386. І Лінус "став серйозно обмірковувати маніакальну ідею, як зробити Minix краще за себе самого".

Командна оболонка в UNIX-системах вже існувала, це була оболонка Bourne shell (shell Баурна або просто shell). Трохи пізніше в UNIX-системах розробили оболонку C shell, яка використовує інший синтаксис, що чимось нагадує синтаксис мови програмування Сі.

Для Linux розроблено багато командних інтерпретаторів. Основною, що використовується за замовчуванням, є "Bash", розроблена на основі shell і звана "Новий Shell Баурна" (Bourne Again Shell). Таким чином, Bash - це розвиток колишнього shell з додаванням багатьох корисних можливостей, які частково містяться в C shell. Оскільки Bash можна розглядати як надмножина синтаксису колишнього shell, будь-яка програма, написана на доброму старому shell Баурна, повинна працювати і в Bash.

Однак слід зазначити, що ОС Linux не є UNIX-системою, оскільки її код був повністю переписаний, спочатку Лінусом, надалі за допомогою багатьох UNIX-програмістів та ентузіастів з Internet, тих, хто має достатньо навичок та здібностей розвивати систему.

Ядро Linux не використовує коди UNIX або іншого приватного джерела, і більшість програм Linuxрозроблені в рамках проекту GNU із Free Software Foundation у Cambridge, Massachusetts. Але в нього внесли внесок також програмісти всього світу.

Ось найпоширеніші командні оболочі Linux:

  • Bourne shell – оболонка Борна, стандарт для багатьох UNIX-подібних систем;
  • bash - Bourne Again shell, "нова оболонка Борна" (використовується за умовчанням в Linux);
  • csh – С shell, оболонка Сі: синтаксис її командної мови схожий на синтаксис мови С;
  • tcsh - tiny С shell, мінімальна оболонка Сі;
  • pdksh – public domain Korn shell, загальнодоступна оболонка Корна;
  • sash - stand-alone shell, автономна оболонка, можна використовувати у разі, коли програмні бібліотеки недоступні.

Список усіх встановлених у системі програм-оболонок знаходиться у файлі /etc/shells.

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

Для редагування файлу /etc/passwd у Linux існує спеціальна команда vipw, яка перевіряє правильність редагування (команда доступна лише адміністратору).

Надалі, при роботі в оболонці за умовчанням, ви можете змінити поточну оболонку на будь-яку з встановлених (точніше, увійти до підболочки). Щоб вийти з неї та повернутись до батьківської оболонки, введіть команду exit . У початковій оболонці команда завершує сеанс роботи.

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

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

2. Розбір командного рядка, обрані функції bash

Інтерпретатор, отримавши командний рядок, виконує над ним ряд перетворень, використовуючи для цього свої потужні функції, а саме:

  1. Розкриває псевдоніми (alias) для швидкого викликунайбільш уживаних команд.
  2. Розкриває метасимволи або групові символи (*, ?, [, ], ~, (, )) для пошуку файлів за шаблонами імен.
  3. Підставляє змінні, які можна використовувати командний процесор.
  4. Перенаправляє вихідні дані однієї команди як вхідні дані для іншої команди, використовуючи конвеєр (pipe).
  5. Виконує об'єднання команд.
  6. Виконує команду, якщо вона - вбудована команда інтерпретатора, або запускає процес, якщо зовнішня команда.
  7. Перенаправляє стандартне введення/виведення.

Для виконання трьох останніх функцій потрібне використання спеціальних операторів. Розберемо всі ці функції.

2.1. Псевдоніми

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

Наприклад:

$ export HELLO="Hello from environment! " # пробіл потрібно екранувати лапками

Змінні оточення

Оточення (environment)- це набір змінних, значення яких може змінювати поведінку оболонки.

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

Таким чином, командний інтерпретатор визначає змінні оточення, що використовуються у поточному сеансі. Кожна нова введена команда фактично запускається як дочірній процес батьківського процесу, якою, у разі виступає командний інтерпретатор bash. Змінні оточення відрізняються від звичайних змінних тем, що вони доступні як батьківських, так дочірніх процесів. Автоматичне визначення змінних оточення відбувається після автентифікації користувача у системі. Програма login, у разі успішного завершення процесу аутентифікації, на основі файлу /etc/passwd визначає, який командний інтерпретатор буде використовуватися в сеансі даного користувача. Після визначення командного інтерпретатора відбувається налаштування сеансу згідно з конфігураційними файлами, наведеними нижче.

Конфігураційний файлОпис
/etc/profile

Визначає змінні оточення всім користувачів системи. Цей файл виконується при першому вході в систему і містить основні змінні оточення, такі як змінна пошуку розташування команд PATH, змінна імені хоста HOSTNAME, змінна, що визначає розмір історії команд HISTSIZE. Крім того, цей файл генерує додаткові змінні оточення з конфігураційних файлів, що знаходяться в каталозі /etc/profile.d .

/etc/bashrc

Виконується всім користувачів, при кожному запуску командного інтерпретатора bash. У цьому файлі визначається значення змінної PS1, і навіть додаткові псевдопіми команд (alias). Псевдонімом називається скорочена довільно задана назва команди або послідовності команд, що дозволяє виконувати складні послідовності команд, не вводячи їх з клавіатури, а викликаючи через звернення до відповідного псевдоніму. Змінні, визначені в даному файлі можуть бути перепризначені аналогічним користувальницьким файлом -/.bashrc, який має більш високий пріоритет.

-/.bashprofile

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

~/.bashrc

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

~/.bash_logout

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

/etc/inputrc

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

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

export AB=/usr/dog/contagious/ringbearer/grind

У цьому прикладі тимчасової змінної оточення AB присвоюється шлях до каталогу, розташованому досить "глибоко" в ієрархії каталогів файлової системи. Команда export вказує на необхідність експорту значення змінної АВ в оболонку, щоб зробити його доступним для інших оболонок, які можуть бути відкриті в межах поточного сеансу роботи з системою. Тепер до вищезазначеного каталогу можна дістатися за допомогою виконання команди cd $AB

Єдиним недоліком тимчасових змінних оточення є те, що вони автоматично знищуються при завершенні поточного сеансу роботи із системою. Для того щоб створити постійну (на відміну від тимчасової) змінну оточення, її необхідно внести до файлу налаштування командної оболонки.bashrc.

Для зміни конфігураційних файлів /etc/profile та /etc/bashrc необхідно бути суперкористувачем root.

Звичайні користувачі можуть змінювати конфігураційні файли ~/.bash_profile, ~/.bashrc та ~/.bash_Iogout, що знаходяться в їх домашніх каталогах. У ці конфігураційні файли можна включити встановлення своїх змінних в оточення за допомогою команди export та використовувати їх у будь-якому сеансі.

Однією з найбільш змінних змінних оточення є змінна PATH. Можна також перевизначити або доповнити змінну оточення PATH конфігураційному файлі~/.bashrc.

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

Щоб ці зміни застосовувалися в оточенні поточної оболонки, необхідно виконати команду source .bashrc

Найбільш поширені змінні оточення командної оболонки:

  • BASH - Містить повний шлях до команди bash (зазвичай значення цієї змінної дорівнює /bin/bash).
  • BASH_VERSION – Номер версії bash.
  • DIRSTACK- Масив, що містить поточне значення стека каталогу.
  • EDITOR - текстовий редакторза замовчуванням.
  • EUID – Числовий ефективний ідентифікатор поточного користувача.
  • FUNCNAME – ім'я поточної функції у скрипті.
  • GROUPS - Масив, що містить перелік груп, до яких належить поточний юзер.
  • HISTFILE - Розташування файлу історії команд. Як правило, історія команд зберігається у файлі ~/.bash_history.
  • HISTFILESIZE - Число командних рядків, які можуть зберігатися у файлі історії. Після досягнення цього числа нові командні рядки заносяться в історію за рахунок видалення ранніх командних рядків. За замовчуванням розмір списку команд, що не використовувалися, дорівнює 1000 рядків.
  • HOME – Домашній каталог користувача.
  • HOSTNAME - Ім'я цього комп'ютера (вузла).
  • HOSTTYPE - Тип комп'ютера.
  • LANG - Поточна мова, що використовується за замовчуванням.
  • LC_CTYPE - внутрішня змінна, яка визначає кодування символів.
  • MAIL - Розташування файлу скриньки електронної поштикористувача. Як правило, це файл, що знаходиться в каталозі /var/spool/mail, ім'я якого збігається з реєстраційним ім'ям користувача.
  • MAILCHECK – Інтервал у хвилинах між перевірками пошти.
  • OLDPWD – Каталог, який був поточним до моменту останньої зміни каталогу.
  • OSTYPE - Поточна операційна система.
  • PATH - Розділений символами двокрапки список каталогів, в яких проводиться пошук файлів, що виконуються. Дуже важливим є порядок льодування імен каталогів. При виконанні команд перелічені у цій змінній каталоги перевіряються послідовно зліва направо. Т.ч., при виконанні команди foo, розташованої в каталогах /bin та /usr/bin, буде виконана команда, розташована в каталозі /bin. Для того щоб в аналогічній ситуації була виконана команда foo, розташована в каталозі /usr/bin, слід або вказати повний шлях до цієї команди, або змінити порядок проходження імен каталогів у змінній оточенні PATH. Поточний каталог пошуку повинен бути заданий явно ("."), оболонка не здійснює пошук у поточному каталозіза замовчуванням. Пошук програм, що запускаються в поточному каталозі, таїть потенційну небезпеку внаслідок можливості ненавмисного виконання. небезпечної програмитому змінна PATH зазвичай ініціалізується без "." Для того, щоб додати до змінної PATH шлях до своїх команд або сценаріїв оболонки, їх слід розмістити в підкаталозі /bin домашнього каталогу, який буде автоматично занесений до змінної PATH. Не всі виконувані командирозташовані в каталогах, перерахованих у змінному оточенні PATH. Деякі команди вбудовані безпосередньо в оболонку. Інші команди можуть бути перевизначені за допомогою псевдонімів, що дають змогу замінити команди з параметрами практично будь-якої складності (з погляду синтаксису) одним простим ім'ям. Крім цього, існує можливість створення функцій, що зберігають цілу послідовність команд.
  • PPID - Ідентифікаційний номер процесу, що відповідає команді, в результаті виконання якої була запущена поточна оболонка (наприклад, процес, що породив оболонку).
  • PS1, PS2, PS3, PS4 - Змінні, що визначають вид запрошення оболонки.

    Змінні PS1 та PS2 встановлюють первинне та вторинне запрошення командного інтерпретатора.

    Повторне запрошення (PS2) з'являється, якщо ви натиснули клавішу Enter, синтаксично не закінчивши введення команди.

    Ця змінна містить другорядне запрошення, яке виникає при багаторядковому редагуванні тексту або незавершеному введенні команди. За промовчанням воно позначається як >.

    PS3. Ця змінна містить запрошення, наявне в операторі select, яка використовується для організації інтерактивних консольних меню. За промовчанням запрошення PS3 в операторі select відповідає значення #?.

    PS4. Ця змінна використовується в основному при налагодженні сценаріїв командного інтерпретатора і за замовчуванням містить рядкове значення "++".

    Наприклад, запуск команди отримання інформації DNS:

    # nslookup >

  • PWD - Поточний робочий каталог користувача. Це значення змінюється щоразу під час переходу до іншого каталогу за допомогою команди cd.
  • SECONDS – час роботи скрипта (в сек.).
  • SHELL - Поточний інтерпретатор команд.
  • SHELLOPTS - Список включених параметрів інтерпретатора.
  • SHLVL – Число запусків нових копій інтерпретатора команд.
  • UID – Числовий ідентифікатор поточного користувача.
  • USER – Ім'я поточного користувача.
  • $# - Загальна кількість параметрів, переданих скрипту.
  • $* - Всі аргументи передані скрипту (виводяться в рядок).
  • $@ - Те саме, що й попередній, але параметри виводяться в стовпчик.
  • $! - PID останнього запущеного у фоні процесу.
  • $$ - PID самого скрипта.

Щоб переглянути значення всіх змінних поточного сеансу, як певних вами, так і змінних оточення, введіть set без параметрів або env printenv .

Видалити змінну можна командою unset.

2.4. Підстановки та організація взаємодії між командами

Підстановка значень змінних оточенняпоточного сеансу роботи із системою може бути здійснена за допомогою використання метасимволу знака долара ($). В результаті оболонка автоматично замінює ім'я змінної її значення. Наприклад,

Підстановка результату обчислення арифметичного виразу

Існують дві синтаксичні форми підстановки результату обчислення арифметичного виразу: $[вираз] та $((вираз)). Наприклад,

echo "I am $ years old."

Підстановка команд

Підстановка команд дозволяє використовувати виведення однієї команди у командному рядку, що містить іншу команду. Можна використовувати два альтернативних форматупідстановки: $(команда) або `команда` (одинарні зворотні лапки). Наприклад,

Розкриття символу тильди

Символ тильди (~) дозволяє швидко вводити назви каталогів.

~ Ім'я домашнього каталогу користувача ~/підкаталог Ім'я одного з підкаталогів у домашньому каталозі користувача ~+ Ім'я поточного каталогу ~- Ім'я попереднього каталогу

Розкриття фігурних дужок

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

mkdir expenses/(Jan,Feb,Mar) еквівалентна mkdir expenses/Jan mkdir expenses/Feb mkdir expenses/Mar

Канали

Метасимвол каналу (|) вказує на необхідність організації взаємодії між командами шляхом використання як вхідні дані (введення) команди результату виконання (виведення) іншої команди. Іншими словами, за допомогою каналу (конвеєра) результати першої команди можуть бути передані як вхідні дані до другої команди. Наприклад,

cat /etc/passwd | sort | head -3

Послідовності та групи команд

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

команда1;команда2 Виконати спочатку команду 1, потім команду 2 (команда1;команда2) Запустити окрему копію інтерпретатора, в якій виконати послідовно команди 1 і 2 ( команда1;команда2 ) Виконати команди 1 і 2 послідовно в поточному інтерпретаторі команда1 && команда2 Виконати у разі успішного виконання команди 1 команда1 || команда2 Виконати команду 2 лише у разі неуспішного виконання команди 1

Результатом виконання будь-якої команди (тобто результатом завершення відповідного процесу) є код завершення. Успішне завершення має код 0, неуспішне 1. Чи значення коду завершення надається зумовленою змінною? (знак питання). Наприклад, echo$?

Повторне виконання команд

Оболонка має у своєму розпорядженні засоби, що дозволяють викликати попередні команди і редагувати їх. Історія (history) команд оболонки є список використовуваних раніше команд. Цей список можна переглянути за допомогою history.

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

Щоб переглянути список команд, які раніше використовувалися, виконайте команду history. Вона може використовуватися або без параметрів, або з параметром, що дозволить вказати кількість команд, що відображаються. Кожен командний рядок має свій номер в історії команд.

Синтаксис розкриття історії: !n Виконати команду із заданим номером!! Виконати попередню команду!рядок Виконати останню з команд, що починаються із заданого рядка!?рядок? Виконати останній з команд, що містять заданий рядок

Замість безпосереднього виконання командного рядка, що міститься в історії команд, його можна викликати для подальшого редагування. Скористайтеся клавішами керування курсором "стрілка вгору" та "стрілка вниз"для покрокового переглядуісторії команд та вибору необхідного командного рядка.

3. Вбудовані команди bash

Список вбудованих команд оболонки bash можна отримати за командою help або знайти на man-сторінці у секції SHELL BUILTIN COMMANDS.

Ось кілька корисних вбудованих команд:

  • echo [аргументи] – Виведення аргументів на екран.
  • enable - Примушує оболонку замість вбудованої команди виконати файл, що виконується, з таким же ім'ям. Корисно, якщо у вас є власний сценарій на ім'я, наприклад, echo.
  • eval [аргументи] - Конструювання команди на льоту, із зазначених аргументів, та відправлення її на виконання.
  • let - Обчислення виразів.
  • - Прочитати та виконати команди, що містяться у файлі. Застосовується для визначення змінних користувачів. та функцій.
  • basename - Виділення локального імені.
  • expr - Обчислення виразу.
  • read – Введення значення змінної.
  • shift – Зсув списку параметрів.
  • test – Перевірка умови.
Інші вбудовані команди є інструкціями командної мови bash.

Прочитавши цю статтю, ви дізнаєтесь, що таке bash(стандартний командний інтерпретатор лінукс), навчитеся поводитися зі стандартними командами: ls, cp, mv... зрозумієте призначення інодів, жорстких і символічних посиланьі багато іншого.

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

Введення в bash

Shell

Якщо ви використовуєте лінукс, то знаєте, що після логіну вас вітає запрошення командного інтерпретатора. Наприклад таке:

\$

Якщо після логіну завантажується графічна оболонка, то щоб дістатися командного інтерпретатора потрібно запустити емулятор терміналу (gnome-terminal, xfce4-terminal, konsole, xterm, rxvt…) або перейти на один з віртуальних терміналів натиснувши CtrlAltF1або CtrlAltF2і т.д.

Запрошення командного інтерпретатора на вашому комп'ютері може відрізнятись від того, що показано в прикладі. Це може містити ім'я користувача, ім'я комп'ютера та назву поточної робочої директорії. Але незважаючи на всі ці відмінності, програма яка друкує це запрошення називається « shell» (оболонка), і швидше за все в ролі вашої командної оболонки виступає програма яка називається bash.

У вас запущено bash?

Перевірити чи запущений bash можна наступною командою:

\$ echo \$SHELL/bin/bash

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

\$ bash

Що таке bash

Bash (акронім від « B ourne- a gain SH ell») це стандартний інтерпретатор команд на більшості лінукс систем. У його обов'язки входить обробка та виконання команд, за допомогою яких користувач управляє комп'ютером. Після завершення роботи можна завершити процес командного інтерпретатора. Після натискання клавіш CtrlD, команд exitабо logoutпроцес командного інтерпретатора буде завершено і на екрані знову з'явиться запрошення ввести ім'я користувача та пароль.

Використання «cd»

Почнемо використовувати bash для навігації по файловій системі. Для початку надрукуйте наступну команду:

$ cd /

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

Шляхи

Щоб дізнатися де файлової системи в даний момент ви знаходитесь (поточну робочу директорію) наберіть:

\$ pwd /

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

Абсолютні шляхи

Ось кілька прикладів абсолютних шляхів

/dev /usr /usr/bin /usr/local/bin

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

Відносні шляхи

Другий вид шляхів називається відносними. Bash, команда cdта інші команди відраховують ці шляхи щодо поточної директорії. Відносні шляхи ніколи не починаються з / . Наприклад, якщо ми перебуваємо в /usr

\$ cd /usr

Потім ми можемо перейти в /usr/local/bin, використовуючи відносний шлях

\$ cd local/bin \$ pwd/usr/local/bin

Використання «..»

Відносні шляхи можуть містити одну або кілька директорій «..» . «..» вказує на батьківську директорію по відношенню до нашої робочої директорії. Приклад:

\$ pwd/usr/local/bin \$ cd .. \$ pwd/usr/local

Як ви бачите, команда cd ..'піднімає нас на рівень вище'.

Можна додати .. до відносного шляху. Це дозволить переміститися в директорію, яка знаходиться на одному рівні з тією, в якій ми знаходимося. Приклад:

\$ pwd/usr/local \$ cd ../share \$ pwd/usr/share

Приклади з використанням відносних шляхів

Відносні шляхи можуть бути складними. Ось кілька прикладів. Результат виконання команд не показаний, спробуйте визначити, в якій директорії ви опинитеся використовуючи bash.

\$ cd /bin \$ cd ../usr/share/zoneinfo \$ cd /usr/X11R6/bin \$ cd ../lib/X11 \$ cd /usr/bin \$ cd ../bin/../bin

Робоча директорія "."

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

\$ ./myprog

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

cd та домашня директорія користувача

Для того, щоб перейти в домашню директорію, потрібно набрати

\$ cd

Без аргументу CD перемістить вас у домашню директорію. Для домашнього суперкористувача зазвичай є директорія /root, а для звичайних користувачів - /home/username/. Але якщо ми хочемо вказати конкретний файл, що знаходиться в домашній директорії. Наприклад, як аргумент до програми ‘myprog’? Можна написати:

\$ ./myprog /home/user/myfile.txt

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

\$ ./myprog ~/myfile.txt

~ - спеціальне ім'я, що вказує bash на домашню директорію користувача.

Домашні директорії інших користувачів

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

\$ ./myprog ~fred/fredsfile.txt

Команди лінукс

Введення в ls

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

\$ cd /usr \$ ls X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 include libexec portage share tmp distfiles i686-linux info local portage.old src

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

\$ ls -a. bin gentoo-x86 include libexec portage share tmp .. distfiles i686-linux info local portage.old src X11R6 doc

Детальний список директорій

Після самої команди lsяк її аргумент можна вказати один або більше файлів або директорій. Якщо вказати ім'я файлу, команда lsвиведе інформацію лише про цей файл. А якщо вказати назву директорії, lsпокаже весь її вміст. Опція '-l'команди lsбуває дуже корисною якщо ви хочете окрім імен файлів дізнатися докладнішу інформацію про них (права на файл, ім'я власника, час останньої зміни файлу та його розмір).

У наступному прикладі показано застосування опції '-l'для виведення інформації про файли, що зберігаються в директорії /usr

\$ ls -l /usr drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles lrwxrwxrwx 1 root root 9 Dec 22 20:57 doc -> share/doc 62 root root 1856 Dec 27 15:54 gentoo-x86 drwxr-xr-x 4 root root 152 Dec 12 23:10 i686 4 root root 96 Nov 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 root root 5992 Dec 24 22:30 include lrwxrwxrwx 1 root root 10 Dec 22 20:5 -x 28 root root 13552 Dec 26 00:31 lib drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec drwxr-xr-x 8 root root 240 Dec 22 20:57 local lrx2 :57 man -> share/man lrwxrwxrwx 1 root root 11 Dec 8 07:59 portage -> gentoo-x86/ drwxr-xr-x 60 root root 1864 Dec 8 07:55 portage.old drwxr-xr- 3096 Dec 22 20:57 sbin drwxr-xr-x 46 root root 1144 Dec 24 15:32 share drwxr-xr-x 8 root root 328 Dec 26 00:07 src drwxr-xr4 25 ssl lrwxrwxrwx 1 root root 10 Dec 22 20:57 tmp -> ../var/tmp

У першій колонці відображається інформація про права доступу до кожного файлу у списку. (Трохи пізніше я поясню яка літера що означає) Наступна колонка показує кількість посилань на кожен елемент списку. Третя та четверта колонки - власник та група файлу відповідно. П'ята колонка – розмір. Шоста - час останньої зміни файлу (“last modified time” або mtime). Остання стовпчик - ім'я файлу або директорії (Якщо це посилання, то після знака ‘ –> ' стоїть ім'я об'єкта на який вона посилається).

Як подивитися тільки директорії

Іноді виникає потреба подивитися інформацію лише про директорії, а не про весь їхній вміст. З цим завданням допоможе впоратися опція '-d', яка вказує команді виводити інформацію лише про директорії. Приклад:

\$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share drwxr-xr-x 4 root root 96 18 грудня 18:17 ../share drwxr-xr-x 17 root root 576 24 грудня 09:03 /usr drwxr-xr-x 2 root root 3192 Dec 26 /X11R6/bin drwxr-xr-x 2 root root 14576 Dec 27 08:56 /usr/bin

Рекурсивний список та інформація про іноди

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

І, нарешті, опція '-i'використовується для виведення інодів кожного об'єкта файлової системи.

\$ ls -i /usr 1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 137 info 93892 portage 36737 ssl 70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp

Що таке іноді?

Кожен об'єкт файлової системи (файл, директорія…) має свій унікальний номерзваний інодім(inode number). Ця інформація може бути незначною, але розуміння функції інодів допоможе вам розібратися в багатьох операціях над файловою системою. Наприклад, подивимося на «.» і «..» як на посилання, присутні у кожній директорії. Щоб зрозуміти що собою представляє директорія «..» , дізнаємося про директорію /use/local

\$ ls -id /usr/local 5120 /usr/local

Як можемо бачити, інод директорії /usr/local - 5120. Тепер подивимося який інод у директорії /usr/local/bin/..:

\$ ls -id /usr/local/bin/.. 5120 /usr/local/bin/..

Виходить, що іноди директорій /usr/local та /usr/local/bin/.. збігаються! Це означає, що на інод 5120 посилаються два імені: /usr/local та /usr/local/bin/.. Тобто це два різні імені однієї директорії. Кожен інод вказує певне місце на диску.

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

\$ ls -dl /usr/local drwxr-xr-x 8 root root 240 Dec 22 20:57 /usr/local

На цьому прикладі видно (другий стовпець), що на директорію /usr/local посилаються 8 різних об'єктівфайлової системи Ось їхні імена:

/usr/local /usr/local/. /usr/local/bin/.. /usr/local/games/.. /usr/local/lib/.. /usr/local/sbin/.. /usr/local/share/.. /usr/local/ src/..

mkdir

Давайте розглянемо команду mkdir. Вона слугує для створення нових директорій. У наступному прикладі демонструється створення трьох нових директорій (tic, tac, toe) у директорії /tmp

\$ cd /tmp $ mkdir tic tac toe

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

\$ mkdir won/der/ful mkdir: cannot create directory "won/der/ful": No such file or directory \$ mkdir won \$ mkdir won/der \$ mkdir won/der/ful

Спростити цю операцію можна додавши опцію '-p'до команди mkdir. Ця опція дозволяє створювати вкладену структуру директорій:

\$ mkdir -p easy/as/pie

Щоб дізнатися про можливості цієї утиліти докладніше, прочитайте довідку, що викликається командою man mkdir. Довідки є практично до всіх команд цього посібника (наприклад man ls), крім cd, т.к. вона вбудована в bash (для таких команд довідка викликається так: help cd)

touch

Перейдемо до вивчення команд cpі mv, службовців для копіювання, перейменування та переміщення файлів та директорій. Але перед цим створимо порожній файлу директорії /tmp за допомогою команди touch:

\$ cd /tmp \$ touch copyme

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

echo

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

\$ echo "firstfile" firstfile

Щоб записати рядок у наш файл, перенаправимо до нього висновок команди echo:

\$ echo "firstfile" > copyme

Знак > (Більше) вказує командній оболонці що потрібно перенаправити висновок команди, що стоїть ліворуч у файл, ім'я якого знаходиться праворуч. Якщо файлу з такою назвою не існує, він буде створений автоматично. А якщо такий файл вже є, то він буде перезаписаний (ввесь його вміст буде стертий перед записом нашого рядка). Команда 'ls -l'покаже, що розмір нашого файлу тепер дорівнює 10 байтам - дев'ять байт займає слово 'firstfile' і один байт символ перекладу рядка.

\$ ls -l copyme-rw-r--r-- 1 root root 10 Dec 28 14:13 copyme

cat і cp

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

\$ cat copyme firstfile

Тепер ми можемо розпочати розбір базової функціональності команди. cp. Ця команда приймає два аргументи. Перший - ім'я вже існуючого файлу (copyme), другий - назва нової копії, яку ми хочемо зробити (copiedme).

\$ cp copyme copiedme

Можемо переконатися, що нова копіяфайл має інший номер інода (це означає, що ми отримали дійсно новий окремий файл, а не просто посилання на старий)

\$ ls -i copyme copiedme 648284 copiedme 650704 copyme

mv

Тепер застосуємо команду mvщоб перейменувати файл ("copiedme" -> "movedme"). Номер інода після цієї операції не змінюється, а змінюється лише назва файлу.

\$ mv copiedme movedme \$ ls -i movedme 648284 movedme

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

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

\$ mv /var/tmp/myfile.txt /home/user

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

Потрібно зауважити, існує ймовірність, що новий номер інода може збігтися зі старим, але вона надзвичайно мала.

Щоб перемістити одночасно кілька файлів в одну директорію, потрібно написати:

\$ mv /var/tmp/myfile1.txt /var/tmp/myfile2.txt /home/user \$ mv -t /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt

Якщо додати опцію '-v', на екран буде виведено звіт про виконану операцію:

\$ mv -vt /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt"/var/tmp/myfile1.txt" -> "/home/user/myfile1.txt" "/var/tmp/myfile2.txt" -> "/home/user/myfile2.txt"