Команда pick: прогалини і аргументи

Практично все, що буде потрібно для написання команди pick в оболонці, вже було описано раніше Єдине, з чим ви ще не знайомі, – це механізм читання для користувача введення Вбудована в оболонку функція read зчитує тільки один рядок тексту з пристрою стандартного введення і привласнює отриманий текст (без символу нового рядка) зазначеної змінної:

$ read  greeting

hello, world Ввести нове значення дляgreeting

$ echo $greeting

hello, world

$

Функція read найчастіше використовується в Profile для настройки окру вання при вході в систему, головним чином для завдання змінних оболонки, таких як TERM

Читати дані read може тільки зі стандартного вводу її навіть нель зя перенаправити Жодна з вбудованих в оболонку команд не може бути перенаправлено (на відміну від операторів керування типу for) за допомогою> або <:

$ read  greeting &lt/etc/passwd

goodbye У будь-якому випадку треба ввести значення

illegal io                           Оболонка повідомляє про помилку

$ echo $greeting

goodbye                               greeting має введене значення, а не значення з файлу

$

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

# Pick: вибір аргументів PATH = / bin :/ usr / bin

for i # для кожного аргументу do

echo –n &quot$i  &quot  &gt/dev/tty

read  response

case  $response  in y*)  echo $i  ;

q*)  break esac

done &lt/dev/tty

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

/ Dev / tty, оскільки пристрій стандартного виводу – це майже напевно не термінал

Оператор break запозичений з Сі: він закінчує найближчий з вкладених циклів В даному випадку він забезпечує вихід з циклу for при введенні q Вибір завершується при введенні q – це простий, доступ ний спосіб, сумісний з іншими програмами

Цікаво поекспериментувати з пробілами в аргументах команди

pick:

$ pick  1 2  3

1 2

3

$

Якщо ви хочете подивитися, як pick читає свої аргументи, запустіть її і натискайте Return після кожного запрошення на введення У такому

вигляді все працює добре: for i правильно обробляє аргументи

Цикл можна було б записати і по-іншому:

$ grep for pick Подивимося, що робить ця версія

for  i in  $*

$ pick  1 2  3

1

2

3

$

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

$ grep for pick Спробуємо іншу версію

for  i in  &quot$*&quot

$ pick  1 2  3

1 2 3

$

Теж не працює, тому що $ * – Це одне слово, утворене з усіх аргументів, зібраних разом і розділених пробілами

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

$ grep for pick Випробуймо третю версію

for  i in  &quot$@&quot

$ pick  1 2  3

1 2

3

$

Якщо рядок $ @ не полягає у лапки, то вона ідентична $ * особливості проявляються тільки при наявності подвійних лапок У програмі overwrite $ @ застосовувалася для захисту аргументів користувальницької команди

Підводимо підсумки:

•&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp $ * І $ @ перетворюються в аргументи і повторно проглядаються через прогалини, наявних в аргументі, він перетворюється на кілька аргументів

•&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp $ * являє собою єдине слово, складене з усіх аргу ментів командного файлу, зєднаних разом, з пробілами

•&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp for i нічим не відрізняється від for i in $ @; прогалини в аргументах не обробляються особливим чином, результатом є список слів, що збігаються з вихідними аргументами

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

$ pick  &ltmailinglist

замість

$ pick  `cat mailinglist`

Але не будемо досліджувати цю версію pick: у ній виникають деякі проблеми, і вона набагато складніше, ніж та ж сама програма, написана на Сі, яка буде представлена ​​в наступному розділі

Перші два із запропонованих нижче вправ складні, але вони можуть дечому навчити просунутих програмістів оболонки

Вправа 524Спробуйте написати команду pick, яка зчитувала б аргументи з пристрою стандартного введення, не зазначені в командному рядку Вона повинна правильно обробляти прогалини Ра ботает чи відповідь q Якщо ні, спробуйте виконати наступну вправу ~

Вправа 525Незважаючи на те що вбудовані функції оболонки (як read і set) не можуть бути перенаправлені, сама оболонка може бути тимчасово перенаправлено Прочитайте розділ sh (1), в якому описується exec, і подумайте, як read могла б читати с / dev / tty без виклику подоболочки (Можливо, варто спочатку прочитати главу 7) ~

Вправа 526(Набагато більш легке) Використовуйте read у своєму

. Profile для ініціалізації TERM і всього від неї залежить, як, наприклад, кроків табуляції ~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*