105.1 Урок 2
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
105 Оболонки та сценарії оболонки |
Тема: |
105.1 Налаштування та використання середовища оболонки |
Урок: |
2 з 3 |
Вступ
Подумайте про змінну як про уявну коробку, в яку можна тимчасово помістити частину інформації. Так само, як і у сценаріях ініціалізації, Bash класифікує змінні як shell/local (ті, що живуть лише в межах оболонки, в якій вони були створені), або environment/global (ті, які успадковуються дочірніми оболонками та/або процесами). Фактично, на попередньому уроці ми розглянули оболонки та сценарії їх налаштування або ініціалізації. Зараз зручно зазначити, що сила цих файлів запуску полягає в тому, що вони дозволяють нам використовувати змінні, а також псевдоніми та функції, які допомагають нам створювати та налаштовувати середовище оболонки за нашим вибором.
Змінні: присвоєння та звернення
Змінна може бути визначена як ім’я, що містить значення.
У Bash надання значення імені називається присвоєнням змінної, і це спосіб, у який ми створюємо або встановлюємо змінні. З іншого боку, процес доступу до значення, що міститься в імені, називається зверненням до змінної.
Синтаксис для присвоєння значення змінній такий:
<ім'я_змінної>=<значення_змінної>
Наприклад:
$ distro=zorinos
Змінна distro
дорівнює zorinos
, тобто є частина пам’яті, яка містить значення zorinos
, а distro
є вказівником на цю частину пам’яті.
Однак зауважте, що під час присвоєння значення змінній не може бути жодного пробілу по обидва боки від знака рівності:
$ distro =zorinos -bash: distro: command not found $ distro= zorinos -bash: zorinos: command not found
Через нашу помилку Bash прочитав distro
і zorinos
як команди.
Щоб звернутися до змінної (тобто перевірити її значення), ми використовуємо команду echo
, перед назвою змінної ставимо знак $
:
$ echo $distro zorinos
Імена змінних
При виборі імен для змінних існують певні правила, які ми повинні враховувати.
Ім’я змінної може містити літери (a-z
,A-Z
), цифри (0-9
) і підкреслення (_
):
$ distro=zorinos $ echo $distro zorinos $ DISTRO=zorinos $ echo $DISTRO zorinos $ distro_1=zorinos $ echo $distro_1 zorinos $ _distro=zorinos $ echo $_distro zorinos
Ім’я не може починатися з числа, інакше Bash не зрозуміє це:
$ 1distro=zorinos -bash: 1distro=zorinos: command not found
Воно не може містити пробілів (навіть лапки); за домовленістю замість них використовуються символи підкреслення:
$ "my distro"=zorinos -bash: my: command not found $ my_distro=zorinos $ echo $my_distro zorinos
Значення змінних
Стосовно значення змінних також важливо враховувати низку правил.
Змінні можуть містити будь-які буквено-цифрові символи (a-z
,A-Z
,0-9
), а також більшість інших символів (?
,!
,*
,.
,/
тощо):
$ distro=zorin12.4? $ echo $distro zorin12.4?
Значення змінних повинні бути взяті в лапки, якщо вони містять одинарні пробіли:
$ distro=zorin 12.4 -bash: 12.4: command not found $ distro="zorin 12.4" $ echo $distro zorin 12.4 $ distro='zorin 12.4' $ echo $distro zorin 12.4
Значення змінних також повинні бути взяті в лапки, якщо вони містять символи, які використовуються для переспрямування (<
,>
) або символ вертикальної лінії (|
). Єдине, що робить наступна команда, це створює порожній файл під назвою zorin
:
$ distro=>zorin $ echo $distro $ ls zorin zorin
Але це працює інакше, коли ми використовуємо лапки:
$ distro=">zorin" $ echo $distro >zorin
Однак одинарні та подвійні лапки не завжди взаємозамінні. Залежно від того, що ми робимо зі змінною (присвоєння чи звернення), використання того чи іншого виду лапок матиме наслідки та дасть різні результати. У контексті присвоєння значення змінним одинарні лапки розглядають символи значення змінної буквально, тоді як подвійні лапки дозволяють заміну змінної:
$ lizard=uromastyx $ animal='My $lizard' $ echo $animal My $lizard $ animal="My $lizard" $ echo $animal My uromastyx
З іншого боку, при зверненні до змінної, значення якої містить деякі початкові (або додаткові) пробіли, іноді поєднані із зірочками, ми обов’язково повинні використовувати подвійні лапки після команди echo
, щоб уникнути розбиття полів і розширення імені шляху:
$ lizard=" genus | uromastyx" $ echo $lizard genus | uromastyx $ echo "$lizard" genus | uromastyx
Якщо значення змінної містить знак оклику, що закривається, це має бути останній символ у рядку (інакше Bash подумає, що ми посилаємося на подію history
):
$ distro=zorin.?/!os -bash: !os: event not found $ distro=zorin.?/! $ echo $distro zorin.?/!
Будь-які зворотні скісні риски повинні бути екрановані іншою зворотною скісною рискою. Крім випадку, якщо зворотний слеш є останнім символом у рядку, і ми його не екрануємо, Bash інтерпретує, що нам потрібен розрив рядка, і надасть нам новий рядок:
$ distro=zorinos\ > $ distro=zorinos\\ $ echo $distro zorinos\
У наступних двох розділах ми підсумуємо основні відмінності між локальними змінними і змінними середовища.
Локальні змінні або змінні оболонки
Локальні змінні або змінні оболонки існують лише в тій оболонці, в якій вони створені. За домовленістю локальні змінні записуються малими літерами.
Для проведення кількох тестів створимо локальну змінну. Як пояснювалося вище, ми вибираємо відповідну назву змінної та прирівнюємо її до відповідного значення. Наприклад:
$ reptile=tortoise
Давайте тепер скористаємося командою echo
для звернення до нашої змінної та перевіримо, чи все пройшло так, як очікувалося:
$ echo $reptile tortoise
У певних сценаріях, наприклад, під час написання скриптів, незмінність може бути цікавою властивістю змінних. Якщо ми хочемо, щоб наші змінні були незмінними, ми можемо створити їх лише для читання
:
$ readonly reptile=tortoise
Або надайте їм таку властивість після того, як вони були створені:
$ reptile=tortoise $ readonly reptile
Тепер, якщо ми спробуємо змінити значення reptile
, Bash відмовиться це зробити:
$ reptile=lizard -bash: distro: readonly variable
Note
|
Щоб отримати список усіх змінних лише для читання в нашому поточному сеансі, введіть |
Корисною командою під час роботи з локальними змінними є команда set
.
set
виводить усі поточні призначені змінні оболонки та функції. Оскільки це може бути багато рядків (спробуйте самі!), рекомендується використовувати її в поєднанні з командою, яка виводить інформацію частинами, наприклад, less
:
$ set | less BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="4" [2]="12" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='4.4.12(1)-release' (...)
Чи існує наша змінна reptile
?
$ set | grep reptile reptile=tortoise
Так, ось вона!
Однак reptile
, будучи локальною змінною, не буде успадкована жодними дочірніми процесами, створеними з поточної оболонки:
$ bash $ set | grep reptile $
І, звичайно, ми також не можемо вивести її значення:
$ echo $reptile $
Note
|
Ввівши команду bash у терміналі, ми відкриваємо нову (дочірню) оболонку. |
Щоб скасувати будь-які змінні (локальні чи глобальні), ми використовуємо команду unset:
$ echo $reptile tortoise $ unset reptile $ echo $reptile $
Note
|
Після |
Глобальні змінні або змінні середовища
Глобальні змінні або змінні середовища існують для поточної оболонки, а також для всіх наступних процесів, породжених з неї. За домовленістю змінні середовища записуються великими літерами:
$ echo $SHELL /bin/bash
Ми можемо рекурсивно передати значення цих змінних іншим змінним, і значення останніх зрештою розшириться до значення перших:
$ my_shell=$SHELL $ echo $my_shell /bin/bash $ your_shell=$my_shell $ echo $your_shell /bin/bash $ our_shell=$your_shell $ echo $our_shell /bin/bash
Щоб локальна змінна оболонки стала змінною середовища, потрібно використати команду export
:
$ export reptile
За допомогою export reptile
ми перетворили нашу локальну змінну на змінну середовища, щоб дочірні оболонки могли розпізнавати її та використовувати:
$ bash $ echo $reptile tortoise
Подібним чином, export
можна використовувати для присвоєння та експорту змінної одночасно:
$ export amphibian=frog
Тепер ми можемо відкрити новий екземпляр Bash і успішно звернутися до нової змінної:
$ bash $ echo $amphibian frog
Note
|
За допомогою |
Команда export
також надасть нам перелік усіх існуючих змінних середовища, якщо ввести її без опцій (або з опцією -p
):
$ export declare -x HOME="/home/user2" declare -x LANG="en_GB.UTF-8" declare -x LOGNAME="user2" (...) declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" declare -x PWD="/home/user2" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_CLIENT="192.168.1.10 49330 22" declare -x SSH_CONNECTION="192.168.1.10 49330 192.168.1.7 22" declare -x SSH_TTY="/dev/pts/0" declare -x TERM="xterm-256color" declare -x USER="user2" declare -x XDG_RUNTIME_DIR="/run/user/1001" declare -x XDG_SESSION_ID="8" declare -x reptile="tortoise"
Note
|
Команда |
Ще дві команди, які можна використовувати для виведення списку всіх змінних середовища, це env
і printenv
:
$ env SSH_CONNECTION=192.168.1.10 48678 192.168.1.7 22 LANG=en_GB.UTF-8 XDG_SESSION_ID=3 USER=user2 PWD=/home/user2 HOME=/home/user2 SSH_CLIENT=192.168.1.10 48678 22 SSH_TTY=/dev/pts/0 MAIL=/var/mail/user2 TERM=xterm-256color SHELL=/bin/bash SHLVL=1 LOGNAME=user2 XDG_RUNTIME_DIR=/run/user/1001 PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games _=/usr/bin/env
Окрім того, що це синонім для env
, ми іноді можемо використовувати printenv
подібно до того, як використовуємо команду echo
для перевірки значення змінної:
$ echo $PWD /home/user2 $ printenv PWD /home/user2
Однак зауважте, що з printenv
перед назвою змінної не стоїть $
.
Note
|
|
Запуск програми в модифікованому середовищі
env
можна використовувати для зміни середовища оболонки під час виконання програми.
Щоб розпочати новий сеанс Bash із якомога порожнішим середовищем – очистивши більшість змінних (а також функцій і псевдонімів) – ми використаємо env
з опцією -i
:
$ env -i bash
Тепер більшість наших змінних середовища зникли:
$ echo $USER $
І залишилося лише декілька:
$ env LS_COLORS= PWD=/home/user2 SHLVL=1 _=/usr/bin/printenv
Ми також можемо використовувати env
, щоб встановити певну змінну для певної програми.
У нашому попередньому уроці під час обговорення неінтерактивних оболонок без входу ми бачили, як сценарії не читають жодних стандартних файлів запуску, а замість цього шукають значення змінної BASH_ENV
і використовують це значення як файл запуску, якщо він існує.
Давайте продемонструємо цей процес:
-
Ми створюємо власний файл запуску під назвою
.startup_script
із таким вмістом:CROCODILIAN=caiman
-
Ми пишемо сценарій Bash під назвою
test_env.sh
з таким вмістом:#!/bin/bash echo $CROCODILIAN
-
Ми встановлюємо виконуваний біт для нашого сценарію
test_env.sh
:$ chmod +x test_env.sh
-
Нарешті, ми використовуємо
env
, щоб встановитиBASH_ENV
на.startup_script
дляtest_env.sh
:$ env BASH_ENV=/home/user2/.startup_script ./test_env.sh caiman
Команда
env
є неявною, навіть якщо ми її позбудемося:$ BASH_ENV=/home/user2/.startup_script ./test_env.sh caiman
Note
|
Якщо ви не розумієте рядок |
Загальні змінні середовища
Настав час переглянути деякі з найбільш релевантних змінних середовища, встановлених у файлах конфігурації Bash.
DISPLAY
-
Щодо X-сервера, значення цієї змінної зазвичай складається з трьох елементів:
-
Ім’я хоста (його відсутність означає
localhost
), на якому працює X-сервер. -
Двокрапка як роздільник.
-
Число (зазвичай це
0
і відноситься до дисплея комп’ютера).$ printenv DISPLAY :0
Порожнє значення для цієї змінної означає сервер без системи X Window. Додаткове число, як у
my.xserver:0:1
, посилатиметься на номер екрана, якщо існує більше одного.
-
HISTCONTROL
-
Ця змінна визначає, які команди зберігаються у
HISTFILE
(див. нижче). Існує три можливі значення:ignorespace
-
Команди, що починаються з пробілу, не будуть збережені.
ignoredups
-
Команда, яка збігається з попередньою, не буде збережена.
ignoreboth
-
Команди, які належать до будь-якої з двох попередніх категорій, не будуть збережені.
$ echo $HISTCONTROL ignoreboth
HISTSIZE
-
Встановлює кількість команд, які будуть зберігатися в пам’яті під час сеансу оболонки.
$ echo $HISTSIZE 1000
HISTFILESIZE
-
Встановлює кількість команд, які будуть збережені у
HISTFILE
як на початку, так і наприкінці сеансу:$ echo $HISTFILESIZE 2000
HISTFILE
-
Ім’я файлу, у якому зберігаються всі команди під час їх введення. За замовчуванням цей файл знаходиться в
~/.bash_history
:$ echo $HISTFILE /home/user2/.bash_history
NoteЩоб переглянути вміст
HISTFILE
, ми просто вводимоhistory
. Крім того, ми можемо вказати кількість команд, які ми хочемо бачити, передавши аргумент (кількість останніх команд) уhistory
, наприклад,history 3
. HOME
-
Ця змінна зберігає абсолютний шлях до домашнього каталогу поточного користувача та встановлюється під час входу користувача.
Цей фрагмент коду, починаючи з
~/.profile
, не потребує пояснень (він є джерелом"$HOME/.bashrc"
, якщо він існує):# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
NoteЯкщо ви не зовсім розумієте оператор if, не хвилюйтеся: просто зверніться до уроків про сценарії оболонки.
Пам’ятайте, що
~
еквівалентно$HOME
:$ echo ~; echo $HOME /home/carol /home/carol
NoteКоманди можна об’єднати крапкою з комою (
;
).Ми також можемо підтвердити це за допомогою оператора if:
$ if [ ~ == "$HOME" ]; then echo "true"; else echo "false"; fi true
NoteПам’ятайте: знак рівності
=
використовується для .==
використовується для перевірки рівності. HOSTNAME
-
Ця змінна зберігає TCP/IP ім’я хост-комп’ютера:
$ echo $HOSTNAME debian
HOSTTYPE
-
Тут зберігається інформація про архітектуру процесора хост-комп’ютера:
$ echo $HOSTTYPE x86_64
LANG
-
Ця змінна зберігає локаль (регіональні налаштування) системи:
$ echo $LANG en_UK.UTF-8
LD_LIBRARY_PATH
-
Ця змінна складається з розділеного двокрапкою набору каталогів, де загальні бібліотеки спільно використовуються програмами:
$ echo $LD_LIBRARY_PATH /usr/local/lib
MAIL
-
Ця змінна зберігає файл, у якому Bash шукає електронну пошту:
$ echo $MAIL /var/mail/carol
Іншим загальним значенням для цієї змінної є
/var/spool/mail/$USER
. MAILCHECK
-
Ця змінна зберігає числове значення, яке вказує частоту в секундах, з якою Bash перевіряє наявність нової пошти:
$ echo $MAILCHECK 60
PATH
-
Ця змінна середовища зберігає список каталогів, у яких Bash шукає виконувані файли, коли йому доручається запустити будь-яку програму. Для комп’ютера в нашому прикладі ця змінна встановлюється через загальносистемний файл
/etc/profile
:if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi export PATH
За допомогою оператора if перевіряється ідентичність користувача, і залежно від результату перевірки (root чи інший) ми отримаємо той чи інший PATH. Нарешті вибраний
PATH
поширюється за допомогоюexport
.Зверніть увагу на дві речі щодо значення PATH:
-
Імена каталогів записуються з використанням абсолютних шляхів.
-
Двокрапка використовується як роздільник.
Якщо ми хочемо включити папку
/usr/local/sbin
вPATH
для звичайних користувачів, ми змінимо рядок, щоб він виглядав наступним чином:(...) else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin" fi export PATH
Тепер ми можемо побачити, як змінюється значення змінної, коли ми входимо як звичайний користувач:
# su - carol $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin
NoteМи також могли додати
/usr/local/sbin
доPATH
користувача в командному рядку, ввівшиPATH=/usr/local/sbin:$PATH
абоPATH=$PATH:/usr/local /sbin
— перший запис робить/usr/local/sbin
першим каталогом для пошуку виконуваних файлів; останній робить його останнім.
-
PS1
-
Ця змінна зберігає значення підказки Bash. У наступному фрагменті коду (також із
/etc/profile
) операторif
перевіряє особу користувача та надає йому дуже скорочену підказку відповідно (#
дляroot
або$
для постійних користувачів):if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' fi
Noteid
дляroot
дорівнює 0. Перемкніться наroot
і перевірте це самостійно за допомогоюid -u
.Інші змінні запиту включають:
PS2
-
зазвичай має значення
>
і використовується як підказка продовження для довгих багаторядкових команд. PS3
-
Використовується як підказка для команди
select
. PS4
-
зазвичай встановлюється на
+
та використовується для налагодження.
SHELL
-
Ця змінна зберігає абсолютний шлях поточної оболонки:
$ echo $SHELL /bin/bash
USER
-
Тут зберігається ім’я поточного користувача:
$ echo $USER carol
Вправи до посібника
-
Зверніть увагу на призначення змінних у стовпці “Команда(и)” та вкажіть, чи є отримана змінна “Локальною” чи “Глобальною”:
Команда(и) Локальна Глобальна debian=mother
ubuntu=deb-based
mint=ubuntu-based; export mint
export suse=rpm-based
zorin=ubuntu-based
-
Розгляньте поля “Команда” і “Виведення” та поясніть значення:
Команда Виведення Значення echo $HISTCONTROL
ignoreboth
echo ~
/home/carol
echo $DISPLAY
reptilium:0:2
echo $MAILCHECK
60
echo $HISTFILE
/home/carol/.bash_history
-
Змінні встановлюються неправильно в стовпці “Неправильна команда”. Надайте відсутню інформацію в розділах “Правильна команда” і “Посилання на змінну”, щоб ми отримали “Очікуваний результат”:
Неправильна команда Правильна команда Посилання на змінну Очікуваний результат lizard =chameleon
chameleon
cool lizard=chameleon
chameleon
lizard=cha|me|leon
cha|me|leon
lizard=/** chameleon **/
/** chamelon **/
win_path=C:\path\to\dir\
C:\path\to\dir\
-
Розгляньте мету та напишіть відповідну команду:
Мета Команда Встановіть мову поточної оболонки на іспанську UTF-8 (
es_ES.UTF-8
).Виведіть назву поточного робочого каталогу.
Зверніться до змінної середовища, яка зберігає інформацію про з’єднання
ssh
.Встановіть
PATH
, щоб включити/home/carol/scripts
як останній каталог для пошуку виконуваних файлів.Встановіть для
my_path
значенняPATH
.Встановіть значення
my_path
на значенняPATH
. -
Створіть локальну змінну з назвою
mammal
і призначте їй значенняgnu
: -
Використовуючи підстановку змінної, створіть ще одну локальну змінну з назвою
var_sub
з відповідним значенням, щоб при посиланні черезecho $var_sub
ми отримували:The value of mammal is gnu
: -
Перетворіть
mammal
на змінну середовища: -
Знайдіть її за допомогою
set
іgrep
: -
Знайдіть її за допомогою
env
іgrep
: -
Створіть двома послідовними командами змінну середовища з іменем
BIRD
зі значеннямpenguin
: -
Створіть за допомогою однієї команди змінну середовища з назвою
NEW_BIRD
зі значеннямyellow-eyed penguin
: -
Якщо ви
user2
, створіть папку з назвоюbin
у вашому домашньому каталозі: -
Введіть команду, щоб додати папку
~/bin
до вашогоPATH
, щоб це був перший каталог, у якомуbash
шукає двійкові файли: -
Щоб гарантувати, що значення
PATH
залишиться незмінним під час перезавантаження, який фрагмент коду у формі оператораif
ви б додали до~/.profile
?
Дослідницькі вправи
-
let
: більше ніж отримання арифметичного виразу:-
Виконайте пошук на сторінці довідки або в Інтернеті для команди
let
і її результатів під час встановлення змінних і створіть нову локальну змінну з назвоюmy_val
зі значенням10
як результат додавання 5 і 5: -
Тепер створіть ще одну змінну під назвою
your_val
зі значенням5
як результат ділення значенняmy_val
на 2:
-
-
Результат виконання команди в змінній? Звичайно, це можливо; це називається заміна команд. Дослідіть цю можливість та дослідіть функцію під назвою
music_info
:music_info(){ latest_music=`ls -l1t ~/Music | head -n 6` echo -e "Your latest 5 music files:\n$latest_music" }
Результат виконання команди
ls -l1t ~/Music | head -n 6
стає значенням змінноїlatest_music
. Потім зміннаlatest_music
виводиться командоюecho
(виводить загальну кількість байтів, зайнятих папкоюMusic
, і останні п’ять музичних файлів, що зберігаються в папціMusic
, по одному на рядок).Що з наведеного нижче є дійсним синонімом для
latest_music=`ls -l1t ~/Music | head -n 6`
Опція A:
latest_music=$(ls -l1t ~/Music| head -n 6)
Опція B:
latest_music="(ls -l1t ~/Music| head -n 6)"
Опція C:
latest_music=((ls -l1t ~/Music| head -n 6))
Підсумки
В цьому уроці ми вивчили:
-
Що змінні є дуже важливою частиною середовища оболонки, оскільки вони використовуються як самою оболонкою, так і іншими програмами.
-
Як призначати значення змінним та звертатися до змінних.
-
Відмінності між локальними і глобальними (або змінними середовища) змінними.
-
Як зробити змінні readonly.
-
Як перетворити локальну змінну на змінну середовища за допомогою команди
export
. -
Як вивести всі змінні середовища.
-
Як запустити програму в модифікованому середовищі.
-
Як зробити змінні постійними за допомогою сценаріїв запуску.
-
Деякі загальні змінні середовища:
DISPLAY
,HISTCONTROL
,HISTSIZE
,HISTFILESIZE
,HISTFILE
,HOME
,HOSTNAME
,HOSTTYPE
,LANG
,LD_LIBRARY_PATH
,MAIL
,MAILCHECK
,PATH
,PS1
(та інші змінні підказки),SHELL
іUSER
. -
Значення тильди (
~
). -
Основи оператору if.
Команди, які використані в цьому уроці:
echo
-
Звернення до змінної.
ls
-
Список вмісту каталогу.
readonly
-
Робить змінні незмінними. Виводить усі змінні лише для читання в поточному сеансі.
set
-
Виводить усі змінні і функції у поточному сеансі.
grep
-
Виводить рядки, що відповідають шаблону.
bash
-
Запускає нову оболонку
unset
-
Видаляє змінні.
export
-
Перетворює локальну змінну на змінну середовища. Перелік змінних середовища.
env
-
Перелік змінних середовища. Запуск програми в модифікованому середовищі.
printenv
-
Перелік змінних середовища. Звернення до змінної.
chmod
-
Змінює біти властивостей файлу, наприклад робить його виконуваним.
history
-
Виводить перелік попередніх команд.
su
-
Змінює ідентифікатор користувача або встановлює суперкористувача.
id
-
Виводить ідентифікатор користувача.
Відповіді до вправ посібника
-
Зверніть увагу на призначення змінних у стовпці “Команда(и)” та вкажіть, чи є отримана змінна “Локальною” чи “Глобальною”:
Команда(и) Локальна Глобальна debian=mother
Так
Ні
ubuntu=deb-based
Так
Ні
mint=ubuntu-based; export mint
Ні
Так
export suse=rpm-based
Ні
Так
zorin=ubuntu-based
Так
Ні
-
Розгляньте поля “Команда” і “Виведення” та поясніть значення:
Команда Виведення Значення echo $HISTCONTROL
ignoreboth
Команди, що дублюються, та команди, що починаються з пробілу, не будуть збережені в
history
.echo ~
/home/carol
HOME
дляcarol
є/home/carol
.echo $DISPLAY
reptilium:0:2
На комп’ютері
reptilium
працює X-сервер, і ми використовуємо другий екран дисплея.echo $MAILCHECK
60
Пошта буде перевірятися щохвилини.
echo $HISTFILE
/home/carol/.bash_history
history
буде збережена в/home/carol/.bash_history
. -
Змінні встановлюються неправильно в стовпці “Неправильна команда”. Надайте відсутню інформацію в розділах “Правильна команда” і “Посилання на змінну”, щоб ми отримали “Очікуваний результат”:
Неправильна команда Правильна команда Посилання на змінну Очікуваний результат lizard =chameleon
lizard=chameleon
echo $lizard
chameleon
cool lizard=chameleon
cool_lizard=chameleon
(наприклад)echo $cool_lizard
chameleon
lizard=cha|me|leon
lizard="cha|me|leon"
абоlizard='cha|me|leon'
echo $lizard
cha|me|leon
lizard=/** chameleon **/
lizard="/** chameleon **/"
абоlizard='/** chameleon **/'
echo "$lizard"
/** chamelon **/
win_path=C:\path\to\dir\
win_path=C:\\path\\to\\dir\\
echo $win_path
C:\path\to\dir\
-
Розгляньте мету та напишіть відповідну команду:
Мета Команда Встановіть мову поточної оболонки на іспанську UTF-8 (
es_ES.UTF-8
).LANG=es_ES.UTF-8
Виведіть назву поточного робочого каталогу.
echo $PWD
абоpwd
Зверніться до змінної середовища, яка зберігає інформацію про з’єднання
ssh
.echo $SSH_CONNECTION
Встановіть
PATH
, щоб включити/home/carol/scripts
як останній каталог для пошуку виконуваних файлів.PATH=$PATH:/home/carol/scripts
Встановіть для
my_path
значенняPATH
.my_path=PATH
Встановіть значення
my_path
на значенняPATH
.my_path=$PATH
-
Створіть локальну змінну з назвою
mammal
і призначте їй значенняgnu
:mammal=gnu
-
Використовуючи підстановку змінної, створіть ще одну локальну змінну з назвою
var_sub
з відповідним значенням, щоб при посиланні черезecho $var_sub
ми отримували:The value of mammal is gnu
:var_sub="The value of mammal is $mammal"
-
Перетворіть
mammal
на змінну середовища:export mammal
-
Знайдіть її за допомогою
set
іgrep
:set | grep mammal
-
Знайдіть її за допомогою
env
іgrep
:env | grep mammal
-
Створіть двома послідовними командами змінну середовища з іменем
BIRD
зі значеннямpenguin
:BIRD=penguin; export BIRD
-
Створіть за допомогою однієї команди змінну середовища з назвою
NEW_BIRD
зі значеннямyellow-eyed penguin
:export NEW_BIRD="yellow-eyed penguin"
або
export NEW_BIRD='yellow-eyed penguin'
-
Якщо ви
user2
, створіть папку з назвоюbin
у вашому домашньому каталозі:mkdir ~/bin
або
mkdir /home/user2/bin
або
mkdir $HOME/bin
-
Введіть команду, щоб додати папку
~/bin
до вашогоPATH
, щоб це був перший каталог, у якомуbash
шукає двійкові файли:PATH="$HOME/bin:$PATH"
PATH=~/bin:$PATH
абоPATH=/home/user2/bin:$PATH
однаково правильні. -
Щоб гарантувати, що значення
PATH
залишиться незмінним під час перезавантаження, який фрагмент коду у формі оператораif
ви б додали до~/.profile
?if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
Відповіді до дослідницьких вправ
-
let
: більше ніж отримання арифметичного виразу:-
Виконайте пошук на сторінці довідки або в Інтернеті для команди
let
і її результатів під час встановлення змінних і створіть нову локальну змінну з назвоюmy_val
зі значенням10
як результат додавання 5 і 5:let "my_val = 5 + 5"
або
let 'my_val = 5 + 5'
-
Тепер створіть ще одну змінну під назвою
your_val
зі значенням5
як результат ділення значенняmy_val
на 2:let "your_val = $my_val / 2"
або
let 'your_val = $my_val / 2'
-
-
Результат виконання команди в змінній? Звичайно, це можливо; це називається заміна команд. Дослідіть цю можливість та дослідіть функцію під назвою
music_info
:music_info(){ latest_music=`ls -l1t ~/Music | head -n 6` echo -e "Your latest 5 music files:\n$latest_music" }
Результат виконання команди
ls -l1t ~/Music | head -n 6
стає значенням змінноїlatest_music
. Потім зміннаlatest_music
виводиться командоюecho
(виводить загальну кількість байтів, зайнятих папкоюMusic
, і останні п’ять музичних файлів, що зберігаються в папціMusic
, по одному на рядок).Що з наведеного нижче є дійсним синонімом для
latest_music=`ls -l1t ~/Music | head -n 6`
Це опція A:
latest_music=$(ls -l1t ~/Music| head -n 6)