Інтерпретатор командного мови shell b> p>
1. Основні поняття мови shell
1.1. Введення-вивід
Три напрями вводу-виводу є виділеними - стандартне введення, стандартний висновок і стандартний протокол. Як правило, команди беруть вихідні
дані з стандартного вводу і поміщають результати в стандартний вивід. p>
Стандартні введення, висновок і протокол можна перепризначити. Позначення p>
<
Служить для перепризначення стандартного вводу (дескриптор файлу 0), p>
>
Для стандартного виводу (дескриптор файла 1); p>
>
Для стандартного виводу; якщо файл існує, то виводиться інформація
додається до кінець цього файлу, p>
& & --
закривають відповідно стандартний ввід і виведення. p>
Якщо будь-який з цих конструкцій передує цифра, то з вказаним файлом буде асоційований дескриптор, що дорівнює зазначеної цифри, замість 0 і 1 з
замовчуванням. Наприклад, p>
2>
для стандартного протоколу використовується дескриптор 2, а p>
2> & 1
асоціює дескриптор 2 з файлом, асоційованим з дескриптором 1. p>
... 2> protocol
перепризначає стандартний протокол (дескриптор 2) у файл по імені protocol. p>
Щоб перепризначити стандартний протокол туди ж, куди вже призначено стандартний висновок, слід вжити конструкцію p>
... 2> & 1
Важливий порядок перепризначення: shell виробляє перепризначення зліва направо
за вказаною списку. Так, p>
1> xxx 2> & 1
спочатку асоціює дескриптор 1 з файлом xxx, а потім дескриптор 2 з 1,
тобто теж з xxx. А p>
2> & 1 1> xxx
асоціює дескриптор 2 з терміналом, а 1 - з файлом xxx. p>
Можна перепризначити системний введення на поточний файл: p>
isql - - primer
Ще приклад: запустити програму prog в асинхронному режимі, щоб не треба
було чекати його завершення, засікти час виконання, результати програми направити в файл prog.res, дані про час виконання - в файл prog.tim. p>
time prog> prog.res 2> prog.tim & 1.3. Конвеєр
Конвеєр - послідовність команд, розділених знаком |. Якщо після конвеєра варто; shell чекає його завершення. Якщо & - то не чекає. Роль;
може грати кінець рядка. Сенс конвеєра в тому, що стандартний висновок однієї команди замикається на стандартний ввід іншої. Приклад конвеєра - підрахувати
число про (r) проектних файлів у поточному каталозі. p>
ls *. o | wc-l 1.4. Метасимволи, генерація імен файлів
Метасимволи - символи, що мають спеціальне значення для інтерпретатора: p>
? *; & () | ^ <>
Проте кожен з цих символів може представляти самого себе, якщо перед ним стоїть. Усі символи, укладені між лапками 'і', представляють самих
себе. Між в лапках ( ") виконуються підстановки команд (див. п. 2.2) і параметрів (див. п. 2.3), а символи,`, "і $ можуть екранувати
попереднім символом. p>
Після всіх підстановок в кожному слові команди шукаються символи *,?, і [. Якщо знаходиться хоча б одна з них, то це слово розглядається як шаблон імен
файлів і замінюється іменами файлів, що задовольняють даним шаблоном (в алфавітному порядку). Якщо ні одне ім'я файлу не задовольняє шаблону, то він
залишається незмінним. Значення зазначених символів: p>
*
будь-яка рядок, включаючи і порожню
?
один будь-який символ
[...]
будь-який із зазначених між ними символів. Пара символів, розділених знаком -, означає будь-який символ,
який знаходиться між ними, включаючи і їх самих. Якщо першим символом після "[" йде "!", То зазначені символи не повинні входити до
назва файлу
2.
Синтаксис мови shell
2.1. Коментарі
Рядки, що починаються з #, трактуються як коментарі. p>
2.2. Підстановка результатів виконання команд
Вирази можна укладати у зворотні лапки ( `). Такі вирази обчислюються в місці використання. Вони можуть бути, наприклад, частиною рядків.
Приклад. Нехай параметром дії є ім'я файлу з розширенням. For. Потрібно видалити однойменний файл з розширенням. Err. p>
name = `ena-n $ 1` rm-f $ (name). err
Значення, отримане в результаті виконання команди p>
ena-n $ 1
присвоюється змінної name. Фігурні дужки використані для виділення
аргументу операції переходу від імені до значення. Без них. Err приклеїлася б до імені. p>
2.3. Змінні і підстановка їх значень
Всі змінні в мові shell - текстові. Їхні імена повинні починатися з літери і складатися з латинських букв, цифр і знака підкреслення (_). Щоб
скористатися значенням змінної, треба перед нею поставити символ $. Використання значення змінної називається підстановкою. p>
Розрізняється два класи змінних: позиційні і з ім'ям. Позиційні перемінні - це аргументи командних файлів, їх іменами служать цифри: $ 0 - ім'я
команди, $ 1 - перший аргумент і т.д. Значення позиційним змінним можуть бути присвоєні і командою set (див. Спеціальні команди). Приклад. Після виклику
програми на shellе, що зберігається у файлі ficofl: p>
ficofl-d/*. for
значенням $ 0 буде ficofl, $ 1 --d, $ 2 - /, $ 3 - *. for, значення решти
позиційних змінних будуть порожніми рядками. Зауважимо, що якби символ * при виклику ficofl не був екранований, як аргументи передалися б імена
всіх фортран файлів поточної директорії. p>
Ще дві змінні зберігають командний рядок за винятком імені команди: $ @ еквівалентно $ 1 $ 2 ..., а $ * - "$ 1 $ 2 ...". Початкові значення
змінним з ім'ям можуть бути встановлені таким чином: p>
= [=] ...
Не може бути одночасно функції (див. Керуючі
конструкції) і змінної з однаковими іменами. Для підстановки значень змінних можливі також такі конструкції: p>
$ ()
Якщо значення визначено, то воно підставляється. Дужки
застосовуються лише якщо за слід символ, який без дужок приклеїться до імені. p>
${:-}
Якщо визначена і не є символом нового рядка, то
підставляється її значення; інакше підставляється. p>
${:=}
Якщо не визначена або є символом нового рядка, їй
присвоюється значення; після цього підставляється її значення. p>
${:?}
Якщо визначена і не є символом нового рядка, то
підставляється її значення; інакше на стандартний висновок виводиться і виконання shellа завершується. Якщо опущено, то видається
повідомлення "parameter null or not set". p>
${:+}
Якщо визначена і не є символом нового рядка, то
підставляється; інакше підставляється порожній рядок. p>
Приклад: якщо мінлива d не визначена або є символом нового рядка, то виконується команда pwd p>
echo $ (d: - `pwd`)
Наступні змінні автоматично встановлюються shell'ом: p>
#
кількість позиційних параметрів (десяткове)
--
прапори, вказані при запуску shellа або командою set
?
десяткове значення, повернене попередньої синхронно виконаної командою
$
номер поточного процесу
!
номер останнього асинхронного процесу
@
еквівалентно $ 1 $ 2 $ 3 ...
*
еквівалентно "$ 1 $ 2 $ 3 ..."
Нагадаємо: щоб отримати значення цих змінних, перед ними треба поставити знак $. Приклад: видати номер поточного процесу: p>
echo $ $ 2.4. Спеціальні змінні
Shell'ом використовуються наступні спеціальні змінні: p>
HOME
директорія, в яку користувач потрапляє при вході в систему або при виконанні команди cd без
аргументів
PATH
список повних імен каталогів, в яких шукається файл за умов згадування його неповного імені.
PS1
основна рядок запрошення (за замовчуванням $)
PS2
додатковий рядок запрошення (за замовчуванням>); в інтерактивному режимі перед введенням команди
shell'ом виводиться основна рядок запрошення.
Якщо натиснута клавіша new_line, але для завершення команди потрібно подальше
введення, то з'являється додатковий рядок запрошення
IFS
послідовність символів, які є роздільниками в командному рядку (за замовчанням
, І)
3.
Керуючі конструкції
Проста команда - це послідовність слів, поділена пробілами. Перше слово є ім'ям команди, яка буде виконуватися, а інші будуть
передані їй як аргументи. Назва команди передається їй як аргумент номер 0 (тобто ім'я команди є значенням $ 0). Значення, що повертається простий командою --
це її статус завершення, якщо вона завершилася нормально, або (вісімкове) 200 + статус, якщо вона завершилася аварійно. p>
Список - це послідовність одного або декількох конвеєрів, розділених символами;, &, & & або | | і, можливо, що закінчується
символом; або &. З чотирьох зазначених операцій; і & мають рівні пріоритети, менші, ніж у & & і | |. Пріоритети останніх є рівними
між собою. Символ; означає, що конвеєри будуть виконуватися послідовно, а & - паралельно. Операція & & (| |) означає, що
список, наступний за нею буде виконуватися лише в тому випадку, якщо код завершення попереднього конвеєра нульовий (ненульовий). p>
Команда - це або проста команда, або один з керуючих конструкцій. Кодом завершення команди є код завершення її останньої простої команди. p>
3.1. Цикл ДЛЯ
for [in] do done
Якщо частина in опущена, то це означає in "$ @" (тобто in $ 1 $ 2 ... $ n). Приклад. Вивести на екран всі фортран файли поточної
бібліотеки: p>
for f in *. for do cat $ f done
3.2. Оператор вибору case $ in | ... );;. . . Esac
Оператор вибору виконує, що відповідає першому, якому задовольняє. Форма шаблону та
ж, що й використовується для генерації імен файлів. Частина | шаблон ... може бути відсутнім. p>
Приклад. Визначити прапори і відкомпілювати всі вказані файли. p>
# Ініціалізувати флагflag = # повторювати для кожного аргументаfor ado case $ a in # про (r) єдиного прапори, розділивши їх пробілами - [ocSO]) flag = $ flag '' $ a;; -*) echo 'unknown flag $ a' ;; # компілювати кожен вихідний файл і скинути прапори *. c) cc $ flag $ a; flag =;; *. s) as $ flag $ a; flag =;; *. f) f77 $ flag $ a; flag = ;; # неправильний аргумент *) echo 'unexpected argument $ a';; esacdone
3.3. Умовний оператор. if then [elif then]. . . [Else] fi
Виконується і, якщо його код завершення 0, то виконується, інакше - і, якщо і його код завершення 0, то
виконується. Якщо ж це не так, то виконується. Частини elif і else можуть бути відсутні. p>
3.4. Цикл ПОКИ
while do done
До тих пір, поки код завершення останньої команди є 0, виконуються команди. При заміні службового слова while на until
умова виходу з циклу змінюється на протилежне. p>
Як одна з команд може бути команда true (false). За цією командою не виконується ніяких дій, а код завершення
встановлюється 0 (-1). Ці команди застосовуються для організації нескінченних циклів. Вихід з такого циклу можна здійснити лише за командою break (див.
Спеціальні команди). p>
3.5. Опції
() (;)
Визначається функція з ім'ям. Тіло функції -, укладений між (та). p>
3.6. Зарезервовані слова
Наступні слова є зарезервованими: p>
if then else elif fi case in esac () for while until do done
3.7. Спеціальні команди
Як правило, для виконання кожної команди shell породжує окремий
процес. Спеціальні команди відрізняються тим, що вони вбудовані в shell і виконуються в рамках поточного процесу. p>
:
Порожня команда. Повертає нульовий код завершення.
. file
Shell читає і виконує команди з файлу file, потім завершується; при пошуку file використовується список
пошуку $ PATH.
break [n]
Вихід з внутрішнього for або while циклу; якщо вказано n, то вихід з n внутрішніх процедур.
continue [n]
Перейти до наступної ітерації внутрішнього for або while циклу; якщо вказано n, то перехід до
наступній ітерації n-ого циклу.
cd []
Змінити поточну директорію на директорію. За замовчуванням використовується значення HOME.
echo [... ]
Виводить свої аргументи на стандартний висновок, розділяючи їх пробілами.
eval [... ]
Аргументи читаються, як якби вони надходили з стандартного вводу і розглядаються як команди,
які тут же і виконуються.
exec [... ]
Аргументи розглядаються як команди shell'а і тут же виконуються, але при цьому не створюється нового
процесу. Як аргументи можуть бути вказані напрямки вводу-виводу і, якщо немає ніяких інших аргументів, то буде змінено лише напрямок
вводу-виводу поточної програми.
exit [n]
Завершення виконання shell'а з кодом завершення n. Якщо n опущено, то кодом завершення буде код
завершення останньої виконаної команди (кінець файлу також призводить до завершення виконання).
export [... ]
Ці змінні відзначаються для автоматичного експорту в оточення (див. Оточення)
виконуваних команд. Якщо аргументи не вказані, то виводиться список всіх експортованих змінних. Імена функцій не можуть експортуватися.
hash [-r] [... ]
Для кожної із зазначених команд визначається і запам'ятовується шлях пошуку. Опція-r видаляє всі
запомненние дані. Якщо не вказано ні один аргумент, то виводиться інформація про запомненних командах: hits - кількість звернень shell'а до даної команді;
cost - обсяг роботи для виявлення команди у списку пошуку; command - повне ім'я команди. У деяких ситуаціях відбувається перевичісленіе запомненних
даних, що відзначається позначкою * у полі hits.
pwd
Виводить ім'я поточної директорії.
read [... ]
Читається зі стандартного вводу один рядок; перше її слово присвоюється перша змінної, другий --
другий і т.д., причому всі залишилися слова присвоюються останньої змінної.
readonly [... ]
Забороняється зміна значень зазначених змінних. Якщо аргумент не вказано, то виводиться
інформація про всі змінних типу readonly.
return [n]
Вихід з функції з кодом завершення n. Якщо n опущено, то кодом завершення буде код завершення
останньої виконаної команди.
set [- aefkntuvx [... ]]
Команда встановлює наступні режими:
-a
відзначити змінні, які були змінені або створені, як змінні оточення (див. Оточення)
-e
якщо код завершення команди ненульовий, то негайно завершити виконання shell'а
-f
заборонити генерацію імен файлів
-k
всі змінні з ім'ям поміщаються в оточення команди, а не тільки ті, що передують імені
команди (див. Оточення)
-n
читати команди, але не виконувати їх
-t
завершення shell'а після введення і виконання однієї команди
-u
при підстановці розглядати невстановлені змінні як помилки
-v
вивести вводяться рядки відразу після їх введення
-x
вивести команди і їхні аргументи перед їх виконанням
--
не змінює прапори, корисний для привласнення позиційним змінним нових значень.
При вказівці + замість - кожен з прапорів встановлює протилежний режим. Набір поточних прапорів
є значення змінної $ -. - Це значення, які будуть присвоєні позиційним змінним $ 1, $ 2 і т.д. Якщо всі аргументи опущені,
виводяться значення всіх змінних.
shift [n]
Позиційні змінні, починаючи з $ (n +1), перейменовуються в $ 1 і т.д. За замовчуванням n = 1.
test
обчислює умовні вирази (див. Додаткові відомості. Test)
trap [] [n] ...
Команда буде виконана, коли shell отримає сигнал n (див. Сигнали). (Треба зауважити, що
перевіряється при установці переривання і при отриманні сигналу). Команди виконуються по порядку номерів сигналів. Будь-яка спроба встановити
сигнал, ігнорований даним процесом, не обробляється. Спроба переривання по сигналу 11 (segmentation violation) призводить до помилки. Якщо
опущений, то всі переривання встановлюються в їх початкові значення. Якщо є порожній рядок, то цей сигнал ігнорується shell'ом і
викликаються їм програмами. Якщо n = 0, то виконується при виході з shell'а. Trap без аргументів виводить список команд, пов'язаних з кожним
сигналом.
type [... ]
Для кожного імені показує, як воно буде інтерпретуватися при використанні в якості
імені команди: як внутрішня команда shell'а, що ім'я файлу або ж такого файлу немає взагалі.
ulimit [-f] [n]
Встановлює розмір файлу в n блоків;-f - встановлює розмір файлу, який може бути записаний
процесом-нащадком (читати можна будь-які файли). Без аргументов - виводить поточний розмір.
umask [nnn]
Користувацька маска створення файлів змінюється на nnn. Якщо nnn опущено, то виводиться поточний
значення маски. Приклад: після команди umask 755 будуть створюватися файли, які власник зможе читати, писати і виконувати, а всі інші - тільки
читати і виконувати.
unset [... ]
Для кожного імені видаляє змінну або функцію. Змінні PATH, PS1, PS2 та IFS НЕ
можуть бути видалені.
wait [n]
Чекає завершення зазначеного процесу і виводить код його завершення. Якщо n не вказано, то очікується
завершення всіх активних процесів-нащадків і повертається код завершення 0.
4.
Виконання shell-програм
4.1. Запуск shell'а
Програма, що інтерпретує shell-програми, знаходиться у файлі/bin/sh. При запуску її перший аргумент є ім'ям shell-програми, інші передаються
як позіціональние параметри. Якщо файл, що містить shell-програму, має право виконання (x), то достатньо вказівки лише його імені. Наприклад,
наступні дві команди операційної системи еквівалентні (якщо файл ficofl володіє зазначеним правом і насправді містить shell-програму): p>
sh ficofl-d. g * і ficofl-d. g *
4.2. Виконання
При виконанні shell-програм виконуються всі підстановки. Якщо ім'я команди
збігається з ім'ям спеціальної команди, то вона виполнается в рамках поточного процесу. Так само виконуються і певні користувачем функції. Якщо ім'я
команди не збігається ні з ім'ям спеціальної команди, ні з ім'ям функції, то породжується новий процес і здійснюється спроба виконати подану команду.
p>
Змінна PATH визначає шлях пошуку директорії, що містить цю задачу. За умовчанням це p>
::/bin:/usr/bin:/util:/dss/rk
Директорії пошуку розділяються двокрапками;:: означає поточну директорію.
Якщо ім'я команди містить символ /, значення $ PATH не використовується: імена, що починаються з/шукаються від кореня, решта - від поточної директорії. Положення
знайденої команди запам'ятовується shellом і може бути опитано командою hash. p>
4.3. Оточення
Оточення - це набір пар ім'я-значення, які передаються виконуваної програмі. Shell взаємодіє з оточенням кількома способами. При
запуску shell створює змінну для кожної зазначеної пари, надаючи їй відповідне значення. Якщо ви зміните значення будь-якої з цих
змінних або створите нову змінну, то це не зробить ніякого впливу на оточення, якщо не буде використана команда export для зв'язку змінної
shell'а з оточенням (див. також set-a). Змінна може бути видалена з оточення командою unset (див.). Таким чином, оточення кожної з виконуваних
shell'ом команд формується з усіх незмінених пар ім'я-значення, спочатку отриманих shell'ом, мінус пари, видалені командою unset, плюс
всі модифіковані та змінені пари, які для цього повинні бути вказані в команді export. p>
Оточення простих команд може бути сформовано зазначенням перед нею одного або декількох Присвоєння змінній. Так, p>
TERM = d460 і (export TERM; TERM = d460;)
еквівалентні. Змінні, що беруть участь в таких привласнення, назвемо ключовими параметрами. p>
Якщо встановлений прапор-k (див. set), то всі ключові параметри поміщаються в оточення команди, навіть якщо вони записані після команди. p>
4.4. Сигнали
UNIX'ом підтримуються наступні сигнали: p>
SIGHUP
- 1 --
скасувати (hangup)
SIGINT
- 2 --
переривання (interrupt)
SIGQUIT
- 3 --
нестандартний вихід (quit)
SIGILL
- 4 --
невірна команда (illegal instruction)
SIGTRAP
- 5 --
пастка (trace trap)
SIGFPE
- 8 --
виняткова ситуація при виконанні операцій з плаваючою комою (floating-point exception)
SIGKILL
- 9 --
знищення процесу (kill)
SIGBUS
- 10 --
помилка шини (bus error)
SIGSEGV
- 11 --
порушення сегментації (segmentation violation)
SIGSYS
- 12 --
невірний системний виклик (bad argument to system call)
SIGPIPE
- 13 --
запис у канал без читання з нього (write on a pipe with no one to read it)
SIGALRM
- 14 --
будильник (alarm clock)
SIGTERM
- 15 --
програмне завершення процесу (software termination signal)
Сигнали SIGINT і SIGQUIT ігноруються, якщо команда була запущена асинхронно. Інакше сигнали обробляються так само, як в процесі-предка, за
винятком сигналу SIGSEGV (див. також Спеціальні команди. Trap). p>
4.5. Зауваження
При виконанні команд запам'ятовується їх місцезнаходження. Тому при створенні команди з тим же ім'ям, але що знаходиться в іншій теці, все одно буде
виконуватися стара команда (якщо виклик відбувається за коротким імені). Для виправлення ситуації скористайтеся командою hash з ключем-r (див. Спеціальні
команди). p>
Якщо ви перейменували поточну або вищерозміщених директорію, то команда pwd може давати невірну інформацію. Для виправлення ситуації скористайтеся
командою cd з повним ім'ям директорії. p>
5.
Додаткові відомості
5.1. Команда test
Команда test застосовується для перевірки умови. Формат виклику: p>
test або []
Команда test обчислює і, якщо його значення - істина, повертає код завершення 0 (true); інакше - нульове значення (false).
Ненульовий код завершення повертається і якщо опущені аргументи. може складатися з таких примітивів: p>
-r файл
- Істина, якщо файл існує і доступний для читання
-w файл
- Істина, якщо файл існує і доступний для запису
-x файл
- Істина, якщо файл існує і є виконуваним
-f файл
- Істина, якщо файл існує та є звичайним файлом
-d файл
- Істина, якщо файл існує та є каталогом
c-файл
- Істина, якщо файл існує і є спеціальним символьно-орієнтованим файлом
-b файл
- Істина, якщо файл існує і є спеціальним блок-орієнтованим файлом
-p файл
- Істина, якщо файл існує і є іменованих каналом (pipe)
-s файл
- Істина, якщо файл існує і має ненульову довжину
-t [дескриптор файлу]
- Істина, якщо відкритий файл із зазначеним дескриптором (за умовчанням 1) існує і асоційований з
терміналом
-z s1
- Істина, якщо довжина рядка s1 нульова
-n s1
- Істина, якщо довжина рядка s1 ненульова
s1 = s2
- Істина, якщо рядки s1 і s2 збігаються
s1! = s2
- Істина, якщо рядки s1 і s2 не збігаються
s1
- Істина, якщо s1 непорожній рядок
n1-eq n2
- Істина, якщо цілі n1 і n2 алгебраїчних збігаються. На місці-eq можуть бути також-ne,-gt,-ge,
-lt,-le
5.2. Команда expr
Команда expr застосовується для обчислення виразів. Результат виводиться на стандартний висновок. Операнди вирази повинні бути розділені пробілами.
Метасимволи повинні бути екрановані. Треба зауважити, що 0 повертається як числа, а не для індикації порожнього рядка. Рядки, що містять пробіли
або інші спеціальні символи, повинні бути укладені в лапки. Цілі розглядаються як 32-бітові числа. p>
Нижче наведений список операторів у порядку зростання пріоритету, операції з рівним пріоритетом укладені у фігурні дужки. Перед символами, які повинні
бути екрановані, варто. p>
|
якщо перше не пусте і не нульове, то повертає його, інакше повертає другу
&
якщо обидва не порожні і не нульові, то повертає перше, інакше повертає 0
(=,>,> =,