103.1 Урок 2
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
103 GNU команди Unix |
Тема: |
103.1 Робота у командному рядку |
Урок: |
2 з 2 |
Вступ
Середовище операційної системи містить основні інструменти, такі як оболонки командного рядку, а іноді і графічний інтерфейс, які вам знадобляться для виконання завдань. Але ваше середовище також матиме каталог ярликів і попередньо встановлених їх значень. В цьому уроці ми дізнаємося, як виводити ці значення, викликати їх та керувати ними.
Змінні середовища
Тож як нам визначити поточні значення для кожної з наших змінних середовища? Один із способів - за допомогою команди env
:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Ви отримаєте багато результатів - набагато більше, ніж те, що включено у вищенаведеному фрагменті. Але зараз зверніть увагу на запис PATH
, який містить каталоги, де ваша оболонка (та інші програми) шукатиме інші програми без необхідності вказувати повний шлях. З цими параметрами ви можете запустити програму на виконання, яка знаходиться, скажімо, у /usr/local/bin
з вашого домашнього каталогу, і вона працюватиме так, ніби файл був локальним.
Давайте на мить змінимо тему. Команда echo
виведе на екран все, що ви їй скажете. Вірте чи ні, але буде багато випадків, коли змусити echo
буквально повторити щось буде дуже корисним.
$ echo "Hi. How are you?" Hi. How are you?
Але є ще інші речі, які ви можете зробити за допомогою echo
. Коли ви передаєте цій команді ім’я змінної середовища – і повідомляєте, що це змінна, додаючи до назви змінної префікс «$», – тоді, замість того, щоб просто друкувати ім’я змінної, оболонка видасть вам значення змінної. Не впевнені, чи є ваш улюблений каталог зараз серед шляхів, зазначених у змінній PATH? Ви можете швидко перевірити змінну за допомогою echo
:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Створення нових змінних середовища
Ви можете додати власні змінні до свого середовища. Найпростіший спосіб - використати символ =
. Рядок зліва буде ім’ям вашої нової змінної, а рядок праворуч – її значенням. Після цього ви можете передати ім’я змінної в echo
, щоб мати підтвердження, що вона встановлена:
$ myvar=hello $ echo $myvar hello
Note
|
Зверніть увагу, що під час присвоєння значення змінній немає пробілів по обидва боки від знака рівності. |
Але чи справді це спрацювало? Введіть bash
у терміналі, щоб відкрити нову оболонку. Ця нова оболонка виглядає точно так само, як та, в якій ви щойно були, але насправді це дитя початкової (яку ми називаємо батьком). Тепер, всередині цієї нової дочірньої оболонки, спробуйте змусити echo
зробити свою магію, як раніше. Нічого не відбулось. Чому?
$ bash $ echo $myvar $
Змінна, яку ви створюєте таким чином, як ми щойно зробили, буде доступна лише локально — у межах безпосереднього сеансу оболонки. Якщо ви запускаєте нову оболонку, або закриваєте сеанс за допомогою exit
, змінна не буде існувати у новому середовищі. Якщо тут ввести exit
, ви повернетеся до вашої початкової батьківської оболонки, яка зараз саме там, де ми хочемо бути. Ви можете запустити echo $myvar
ще раз, якщо хочете просто переглянути, чи змінна все ще дійсна. Тепер введіть export myvar
, щоб передати змінну в будь-які дочірні оболонки, які ви можете потім відкрити. Спробуйте: введіть bash
для нової оболонки, а потім echo
:
$ exit $ export myvar $ bash $ echo $myvar hello
Усе це може здатися трохи безглуздим, коли ми створюємо оболонки без реальної мети. Але розуміння того, як змінні оболонки поширюються у вашій системі, стане дуже важливим, щойно ви почнете писати серйозні сценарії.
Видалення змінних середовища
Хочете знати, як очистити всі ті ефемерні змінні, які ви створили? Один із способів — просто закрити батьківську оболонку або перезавантажити комп’ютер. Але є і простіші способи. Як, наприклад, unset
. Введення unset
(без $
) видаляє змінну. Команда echo
зараз це доведе.
$ unset myvar $ echo $myvar $
Якщо є команда unset
, то можна передбачити, що існує і команда set
. Запуск set
сам по собі відобразить багато результатів, але насправді це не дуже відрізняється від того, що дає вам env
. Подивіться на перший рядок виведення, який ви отримаєте, якщо застосуєте фільтрацію для PATH
:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
Яка різниця між set
та env
? Для наших цілей головне те, що set
виводить усі змінні та функції. Давайте це переглянемо. Ми створимо нову змінну під назвою mynewvar
, а потім підтвердимо, що вона створена:
$ mynewvar=goodbye $ echo $mynewvar goodbye
Тепер запуск env
з використанням grep
для фільтрації рядка mynewvar
не відображатиме жодного результату. Але виконання set
таким же чином покаже нам нашу локальну змінну.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Екранування для уникнення спеціальних символів
Зараз доречно ознайомити вас із проблемою спеціальних символів. Алфавітно-цифрові символи (a-z і 0-9) зазвичай читаються Bash буквально. Якщо ви спробуєте створити новий файл під назвою myfile
, ви просто введіть touch
, а потім myfile
, і Bash знатиме, що з ним робити. Але якщо ви хочете включити спеціальний символ до імені файлу, вам доведеться попрацювати трохи більше.
Щоб це проілюструвати, ми введемо touch
і за ним заголовок: my big file
. Проблема в тому, що між словами є два пробіли, які Bash буде інтерпретувати. Хоча технічно ви б не називали пробіл «символом», він схожий на пробіл у тому сенсі, що Bash не читатиме його буквально. Якщо ви виведете вміст вашого поточного каталогу, а не один файл під назвою my big file
, ви побачите три файли з іменами відповідно my
, big
і file
. Це тому, що Bash думав, що ви хочете створити кілька файлів, імена яких ви передаєте у вигляді списку:
$ touch my big file $ ls my big file
Пробіли будуть інтерпретуватися так само, якщо ви спробуєте видалити (rm
) три файли разом за допомогою однієї команди:
$ rm my big file
Тепер давайте спробуємо виконати це правильно. Введіть touch
і три частини назви вашого файлу, але цього разу візьміть назву в лапки. Цього разу це спрацювало. Виведення вмісту каталогу покаже вам один файл із правильним ім’ям.
$ touch "my big file" $ ls 'my big file'
Є й інші способи отримати такий самий ефект. Одинарні лапки, наприклад, працюють так само, як і подвійні. (Зверніть увагу, що одинарні лапки збережуть буквальне значення всіх символів, тоді як подвійні лапки збережуть усі символи, окрім $
, `
, \
і, у деяких випадках, !
.)
$ rm 'my big file'
Додавання до кожного спеціального символу зворотної косої риски «ігнорує» особливості символу і змусить Bash читати його буквально.
$ touch my\ big\ file
Вправи до посібника
-
Використовуйте команду
export
, щоб додати новий каталог до свого шляху (але каталог зникне зі змінної PATH після перезавантаження). -
Використовуйте команду
unset
, щоб видалити зміннуPATH
. Спробуйте запустити команду (наприклад,sudo cat /etc/shadow
) за допомогоюsudo
. Що сталося? Чому? (Вихід з оболонки поверне вас до початкового стану.)
Дослідницькі вправи
-
Скористайтеся Інтернетом, щоб знайти та дослідити повний список спеціальних символів.
-
Спробуйте запустити команди, використовуючи рядки, що складаються зі спеціальних символів, і використовувати різні методи для їх екранування. Чи є відмінності у поведінці цих методів?
Підсумки
На цьому уроці ви дізналися:
-
Як визначити змінні середовища вашої системи.
-
Як створити власні змінні середовища та експортувати їх в інші оболонки.
-
Як видалити змінні середовища та як використовувати команди
env
іset
. -
Як ігнорувати спеціальні символи, щоб Bash читав їх буквально.
На цьому уроці обговорювалися такі команди:
echo
-
Виведення вхідних рядків і змінних.
env
-
Розуміння та зміна змінних середовища.
export
-
Передавання змінної середовища дочірнім оболонкам.
unset
-
Видалення значень та атрибутів змінних і функцій оболонки.
Відповіді на вправи до посібника
-
Використовуйте команду
export
, щоб додати новий каталог до свого шляху (але каталог зникне зі змінної PATH після перезавантаження).Ви можете тимчасово додати новий каталог (можливо, під назвою
myfiles
, який знаходиться у вашому домашньому каталозі) до свого шляху за допомогоюexport PATH="/home/yourname/myfiles:$PATH"
. Створіть простий сценарій у каталозіmyfiles/
, зробіть його виконуваним і спробуйте запустити його з іншого каталогу. Ці команди припускають, що ви перебуваєте у своєму домашньому каталозі, який містить каталог під назвоюmyfiles
.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Використовуйте команду
unset
, щоб видалити зміннуPATH
. Спробуйте запустити команду (наприклад,sudo cat /etc/shadow
) за допомогоюsudo
. Що сталося? Чому? (Вихід з оболонки поверне вас до початкового стану.)Якщо ввести
unset PATH
, поточні налаштування шляху буде видалено. Спроба викликати двійковий файл без його абсолютної адреси не вдасться. З цієї причини спроба запустити команду за допомогою sudo (яка сама по собі є двійковою програмою, розташованою в/usr/bin/sudo
) не вдасться, якщо ви не вкажете абсолютне розташування, наприклад:/usr/bin/sudo /bin/cat /etc/shadow
. Ви можете відновити свою зміннуPATH
за допомогоюexport
або просто вийшовши з оболонки.
Відповіді до дослідницьких вправ
-
Скористайтеся Інтернетом, щоб знайти та дослідити повний список спеціальних символів.
Ось список:
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Спробуйте запустити команди, використовуючи рядки, що складаються зі спеціальних символів, і використовувати різні методи для їх екранування. Чи є відмінності у поведінці цих методів?
Екранування за допомогою символів
"
збереже спеціальні значення знака долара, зворотної галочки'
та зворотної косої риски. З іншого боку, екранування за допомогою символу'
відображатиме всі символи як літерали.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar