Змінні оболонки UNIX

У оболонки є такі ж змінні, як і в більшості мов програмування (в термінах оболонки їх також називають пара5 метрами) Такі рядки, як $ 1, є позиційними параметра5 мі – це змінні, які містять аргументи, що передаються в командний файл Цифра вказує позицію в командному рядку Вже згадувалися такі змінні оболонки, як PATH (список каталогів для пошуку команд), HOME (реєстраційний каталог) та інші Відмінність від змінних звичайної мови полягає в тому, що пере-

менная аргументу не може бути змінена Хоча PATH – це змінна зі значенням $ PATH, але не існує змінної 1, значення якої дорівнювало б $ 1 Так що $ 1 – це просто компактна запис першо го аргументу і нічого більше

Змінні оболонки, які не є позиційними параметрами, можна створювати, звертатися до них і змінювати їх Наприклад,

$ PATH=:/bin:/usr/bin

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

$ PATH=$PATH:/usr/games

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin:/usr/games

$ PATH = :/ usr / you / bin :/ bin :/ usr / bin Відновлення

$

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

$ pwd

/usr/you/bin

$ dir = `pwd` Запамятати поточний каталог

$ cd / usr / mary / bin Перейти в інше місце

$ ln $ dir / cx Використовувати змінну в імені файлу

$ .. Попрацювати деякий час

$ cd $ dir Повернутися назад

$ pwd

/usr/you/bin

$

Вбудована в оболонку команда set показує значення всіх визна лених змінних Щоб побачити одну-дві змінні, розумніше використовувати echo

$ set HOME=/usr/you IFS=

PATH=:/usr/you/bin:/bin:/usr/bin PS1=$

PS2=&gt dir=/usr/you/bin

$ echo $dir

/usr/you/bin

$

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

$ x = Hello Створити x

$ sh Нова оболонка

$ echo $x

Тільки роздільник рядків: x не визначена в підоболонці

$ ctld Залишити цю оболонку

$                                   Назад у вихідну оболонку

$ echo $x

Hello                             x визначена

$

Командний файл не може змінити значення змінної, тому що він запускається подоболочкі:

$ echo x = Good Bye Створити командний файл з двох рядків ..

&gt echo $ x > setx .. для завдання і друку x

$ cat  setx x=&quotGood  Bye&quot echo $x

$ echo $x

Hello                                            У вихідній оболонці x – це Hello

$ sh  setx

Good  Bye                                     У підоболонці x – цеGood  Bye..

$ echo $x

Hello                                            .. Але все щеHello  в цій оболонці

$

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

$ cat  /usr/you/bin/games

PATH=$PATH:/usr/games                       Додати/usr/games  вPATH

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin

$ games

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin:/usr/games

$

Пошук файлу для команди здійснюється за допомогою механізму

PATH, тому можна помістити його в особистий каталог / bin

Виконання файлу командою тільки зовні нагадує запуск командного файлу У звичайному сенсі слова файл не «виконується» Замість цього команди файлу інтерпретуються точно таким чином, як якщо б вони вводилися інтерактивно – стандартний ввід оболонки тимчасово перенаправлений і надходить з файлу Так як файл не испол няется, а тільки читається, йому не потрібні права на виконання Ще одна відмінність полягає в тому, що файл не отримує аргументів командного рядка замість цього є тільки $ 1 і $ 2, а інше порожньо Б ло б зручно, якби передавалися аргументи, але цього не відбувається

Інший спосіб установки значення змінної в підоболонці полягає в явному присвоюванні в командному рядку перед самoй командою:

$ echo echo  $x  &gtechox

$ cx  echox

$ echo $x

Hello                                      Як і раніше

$ echox

$ x=Hi echox

У підоболонці x не встановлена

Hi                                           Значення x передано в подоболочкі

$

(Спочатку присвоювання, що займають будь-яке місце в командному рядку, передавалися команді, але це заважало dd (1))

Механізм слід використовувати для того, щоб перманентно вимірюв нитка значення змінної, а присвоювання в командному рядку – для тимчасових змін Для прикладу ще раз пошукаємо команди в каталозі / usr / games за умови, що каталог не міститься в PATH:

$ ls /usr/games | grep  fort

fortune                                       Команда, що виводить афоризми

$ fortune

fortune: not  found

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin    /usr/games  не міститься вPATH

$ PATH=/usr/games  fortune

Ring the  bell  close the  book  quench the  candle

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin      PATH  не змінена

$ cat  /usr/you/bin/games

PATH=$PATH:/usr/games                   games команда все ще тут

$ games

$ fortune

Premature  optimization is the  root of  all evil  –  Knuth

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin:/usr/games     На цей разPATH  змінена

$

Обидва ці механізми можна використовувати в одному командному файлі Трохи змінена команда games може застосовуватися для запуску гри без зміни PATH або може перманентно змінити PATH так, щоб змінна містила / usr / games:

$ cat  /usr/you/bin/games

PATH=$PATH:/usr/games  $*                                        Зверніть увагу на$*

$ cx  /usr/you/bin/games

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin                            Не містить /usr/games

$ games fortune

Id give  my  right arm to  be ambidextrous

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin                           Усе ще не містить

$ games

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin:/usr/games          Тепер містить

$ fortune

He  who  hesitates is sometimes saved

$

Перше звернення до games запускає командний файл в підоболонці, в якій PATH була тимчасово змінена з тим, щоб включити в себе

/ Usr / games Замість цього другий приклад інтерпретує файл в теку щей оболонці, з порожнім рядком $ *, так що в рядку немає команди, і PATH змінюється У застосуванні цих двох способів для games є певне трюкацтво, в результаті ж зявилося природне і зручний засіб

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

$ x=Hello

$ export  x

$ sh Нова оболонка

$ echo $x

Hello                                      x відома підоболонці

$ x = Good Bye Змінити її значення

$ echo $x

Good  Bye

$ ctl–d Залишити цю оболонку

$                                             Повернутися у вихідну оболонку

$ echo $x

Hello                                        x все щеHello

$

Семантика команди export не очевидна, але для повсякденної роботи досить евристичного правила: не експортує тимчасові пе-

ремінні, експортуйте змінні, які хочете задати у всіх оболонках і подоболочкі (у тому числі, наприклад, оболонки, що запускаються командою редактора ed) Тому слід експортувати спеціальні змінні оболонки, такі як PATH і HOME

Вправа 313Чому ми завжди включаємо поточний каталог в змінну PATH Куди він повинен бути поміщений ~

Джерело: Керниган Б, Пайк Р, 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>

*

*