Для тих, хто прагне опанувати командну оболонку Bash у середовищі Linux, macOS чи інших UNIX-подібних системах, особливі символи, такі як ~, *, | та >, є надзвичайно важливими. Ця стаття розкриє таємниці цих символів, перетворюючи їх на інструменти вашої майстерності в роботі з Linux.
Що ж таке ці спеціальні символи?
У Bash, певні символи обробляються особливим чином. Коли ви вводите їх в оболонку, вони виступають як команди або інструкції, що ініціюють певні дії. Розглядайте їх як односимвольні команди, що мають свою унікальну функціональність.
Однак, іноді вам може знадобитися просто вивести символ на екран, не застосовуючи його спеціальної функції. Для цього існує спосіб, який дозволяє використовувати символ як звичайний текстовий елемент.
Далі ми розглянемо, які символи вважаються “спеціальними” або “метасимволами”, і як використовувати їх в обох цих контекстах: функціональному та буквальному.
~: Скорочення домашнього каталогу
Символ тильда (~) є зручним скороченням для позначення вашого домашнього каталогу. Вам не потрібно вводити повний шлях до домашньої директорії в командах. Незалежно від вашого поточного розташування у файловій системі, ви можете використовувати команду `cd ~`, щоб миттєво перейти до вашого домашнього каталогу:
cd ~
Тильду можна використовувати і з відносними шляхами. Наприклад, для переходу до каталогу `archive`, що знаходиться у підкаталозі `work` вашої домашньої директорії, скористайтеся наступною командою:
cd ~/work/archive
.: Посилання на поточний каталог
Символ крапка (.) представляє поточну директорію. Ви можете побачити її у списках каталогів при використанні команди `ls` з параметром `-a` (показати всі файли):
ls -a
Крапку також можна використовувати в командах для визначення шляху до поточної директорії. Наприклад, для запуску скрипту `script.sh`, розташованого в поточному каталозі, введіть:
./script.sh
Це вказує Bash шукати `script.sh` саме в поточній директорії, а не в інших каталогах у вашому шляху.
..: Посилання на батьківський каталог
Подвійна крапка (..) вказує на батьківський каталог вашої поточної директорії. Використовуйте цю комбінацію для переходу на один рівень вгору в ієрархії каталогів:
cd ..
Подвійна крапка також використовується з відносними шляхами. Наприклад, для переходу до каталогу `gc_help`, що знаходиться на одному рівні з поточним, можна скористатися:
cd ../gc_help
/: Роздільник каталогів у шляхах
Пряма коса риска (/), також відома як слеш, використовується для розділення каталогів у шляху до файлу або директорії:
ls ~/work/archive
Сама по собі, одинарна коса риска (/) позначає кореневий каталог – початок усієї файлової системи Linux. Щоб швидко перейти до кореневого каталогу, скористайтесь командою:
cd /
#: Коментарі та обрізання рядків
Символ решітка (#) в основному використовується для позначення коментарів. Bash ігнорує все, що йде після #. Коментарі часто використовуються у скриптах, хоча їх також можна використовувати в командному рядку (хоча це менш корисно):
# Це буде проігноровано оболонкою Bash
Варто зазначити, що коментарі, хоч і не впливають на виконання команд, все ж додаються до історії команд.
Решітка також використовується для обрізання рядкових змінних, видаляючи текст з початку рядка. Наприклад, створимо змінну `this_string` зі значенням “Дейв Гік!”:
this_string="Dave Geek!"
Наступна команда виведе на екран “How-To Geek!”, обрізавши “Dave” за допомогою #:
echo How-To ${this_string#Dave}
Зверніть увагу, що значення змінної не змінюється, обрізка впливає тільки на вивід. Перевіримо це:
echo $this_string
?: Заміна одного символу
Bash підтримує три символи підстановки, одним з яких є знак питання (?). Ці символи використовуються для заміни символів у шаблонах імен файлів. Шаблон з символом підстановки відповідає цілій групі імен файлів.
Знак питання представляє собою рівно один символ. Наприклад, шаблон `badge?.txt` відповідатиме будь-якому файлу, ім’я якого починається з “badge”, за яким іде будь-який один символ, і закінчується на “.txt”.
ls badge?.txt
Це відповідає, наприклад, файлам `badge1.txt`, `badgeA.txt`, `badgeb.txt` тощо. Знак питання може замінити як букви, так і цифри.
Шаблон `badge.txt` не відповідає даному шаблону, оскільки потрібен хоч один символ між “badge” і “.txt”.
Знак питання можна використовувати для пошуку файлів із конкретною кількістю символів у їхніх іменах. Наприклад, `ls ?????.txt` відобразить всі текстові файли, імена яких складаються рівно з п’яти символів:
ls ?????.txt
*: Заміна послідовності символів
Зірочка (*) є підстановкою для будь-якої послідовності символів, включаючи відсутність символів. Розглянемо шаблон імені файлу:
ls badge*
Цей шаблон відповідає файлу `badge.txt`, тому що зірочка представляє будь-яку послідовність символів або їх відсутність.
ls source.*
Ця команда знайде всі файли з ім’ям “source”, незалежно від їх розширення.
[]: Набір символів для підстановки
Квадратні дужки ([]) дозволяють визначити набір символів, яким має відповідати один символ в імені файлу. Ім’я файлу повинно містити хоча б один із символів, зазначених у дужках.
ls badge_0[246].txt
Ця команда знайде всі файли, імена яких починаються з “badge_0”, за яким іде символ 2, 4 або 6, і закінчуються на “.txt”.
ls badge_[01][789].txt
Можна використовувати кілька наборів дужок в одному шаблоні імені файлу.
ls badge_[23][1-5].txt
Можна також вказувати діапазони символів. Ця команда вибере файли з номерами від 21 до 25 і від 31 до 35 в імені файлу.
;: Роздільник команд
Крапка з комою (;) дозволяє вводити кілька команд в одному рядку. Команди будуть виконуватися послідовно, одна за одною:
ls > count.txt; wc -l count.txt; rm count.txt
Друга команда виконується навіть у випадку помилки в першій, третя – навіть якщо друга не вдалася.
cd ./doesntexist && cp ~/Documents/reports/* .
Для зупинки виконання послідовності команд у випадку невдачі однієї з них, використовуйте подвійний амперсанд (&&) замість крапки з комою.
&: Запуск процесу у фоні
Після виконання команди, ви повертаєтесь до командного рядка. Зазвичай це відбувається швидко, але якщо ви запускаєте програму, наприклад `gedit`, ви не зможете використовувати термінал, поки не закриєте програму.
gedit command_address.page &
Для запуску програми у фоновому режимі, додайте амперсанд (&) в кінці командного рядка.
Bash показує ідентифікатор процесу і повертає вас до командного рядка.
<: Перенаправлення вводу
sort < words.txt
Багато команд Linux зчитують дані з файлу, зазначеного у параметрах. Більшість з них також можуть приймати дані з потоку. Для створення потоку вхідних даних використовуйте ліву кутову дужку (<).
Коли вхідні дані перенаправляються у команду, її поведінка може відрізнятися від тієї, коли вона зчитує дані з файлу. Наприклад, команда `wc`, яка підраховує слова, рядки та символи, при використанні з файлом, виведе значення та ім’я файлу. При перенаправленні вмісту файлу в `wc`, виводяться лише числові значення, а ім’я файлу залишається невідомим.
Ось деякі приклади використання `wc`:
wc words.txt
wc < words.txt
>: Перенаправлення виводу
Використовуйте праву кутову дужку (>) для перенаправлення виводу з команди в файл. Наприклад:
ls > files.txt
cat files.txt
Перенаправлення виводу також може перенаправляти повідомлення про помилки, використовуючи цифру 2 перед >:
wc doesntexist.txt 2> errors.txt
cat errors.txt
|: Конвеєр
Конвеєр (|) з’єднує команди, передаючи вихід однієї команди як вхід до наступної. Кількість команд у конвеєрі може бути довільною.
У цьому прикладі `cat` передає вміст `words.txt` до `grep`, який витягує рядки, що містять букву `c` або `C`. Результати передаються до `sort`, який сортує їх у зворотному порядку (параметр `-r`):
cat words.txt | grep [cC] | sort -r
!: Логічне заперечення та оператор історії
Знак оклику (!) – це оператор логічного заперечення.
[ ! -d ./backup ] && mkdir ./backup
У цьому рядку дві команди: перша – текст у квадратних дужках, друга – після подвійного амперсанда (&&). Команда у дужках перевіряє наявність каталогу `backup`, а друга команда створює цей каталог.
Оператор && виконує другу команду тільки у випадку успіху першої. Однак, у нашому випадку, якщо каталог існує, то його не потрібно створювати. Тут і допомагає оператор заперечення (!). Якщо перевірка існування каталогу пройшла успішно (! перетворює це на невдачу, і друга команда не виконується), а якщо перевірка не вдалася (! перетворює невдачу на успіх, і виконується команда створення каталогу).
Знак оклику (!) робить дуже важливу роботу.
ls -l -d backup
Для перевірки стану папки “backup”, можна використовувати команду `ls` з параметрами `-l` (довгий список) та `-d` (каталог).
!24
Ви можете запускати команди з історії команд, використовуючи знак оклику. Команда `history` показує список ваших команд, а `!<номер>` дозволяє повторно запустити потрібну команду.
!!
Подвійний знак оклику перезапускає останню введену команду:
$: Змінні
У Bash змінні використовуються для зберігання значень. Деякі, наприклад, змінні середовища, завжди доступні після запуску терміналу. Вони зберігають такі дані як ім’я користувача, домашній каталог та шлях до виконуваних файлів.
echo $USER
echo $HOME
echo $PATH
Використовуйте `echo` для виведення значення змінної на екран. Поставте знак долара ($) перед ім’ям змінної.
Користувацькі змінні створюються наступним чином:
ThisDistro=Ubuntu
MyNumber=2001
echo $ThisDistro
echo $MyNumber
Зверніть увагу, що при створенні змінної знак $ не потрібен, його використовують лише при посиланні на змінну.
Розширення параметра дозволяє отримати значення змінної та додатково його трансформувати. Для цього використовуйте фігурні дужки ({}) навколо знака долара.
MyString=123456qwerty
Це створює змінну зі значенням рядка символів:
echo ${MyString}
Використайте наступну команду, щоб передати рядок у термінал:
echo ${myString:6}
Для вилучення підрядка, починаючи з позиції 6 (нумерація з нуля):
echo ${myString:0:6}
Щоб вивести підрядок, що починається з позиції 0, довжиною 6 символів:
echo ${myString:4:4}
Виведе підрядок, що починається з четвертої позиції довжиною в чотири символи.
Екранування спеціальних символів
Якщо вам потрібно використати спеціальний символ як звичайний (літеральний) символ, ви повинні “повідомити” про це Bash. Це називається “екранування”. Існує три способи це зробити:
Текст в подвійних лапках (“…”) перешкоджає Bash виконувати більшість спеціальних символів. Виняток – знак долара ($), який все ще виконує функцію розширення змінних:
echo "Today is $(date)"
Ця команда виводить на екран поточну дату та час:
echo 'Today is $(date)'
Текст в одинарних лапках (‘…’) зупиняє функціонування всіх спеціальних символів:
echo "Today is $(date)"
Використання зворотної косої риски (\) перед символом дозволяє “екранувати” лише один символ:
Розглядайте спеціальні символи як дуже короткі команди. Запам’ятавши їх використання, ви значно підвищите розуміння командної оболонки Bash та скриптів.