Поиск по сайту:

15 специальных символов, которые нужно знать для Bash


Если вы хотите освоить оболочку Bash в Linux, macOS или другой UNIX-подобной системе, специальные символы (например, ~, *, | и >) имеют решающее значение. Мы поможем вам разгадать эти загадочные последовательности команд Linux и стать героем иероглифов.

Что такое специальные символы?

Оболочка Bash обрабатывает набор символов двумя разными способами. Когда вы вводите их в оболочке, они действуют как инструкции или команды и сообщают оболочке о выполнении определенной функции. Думайте о них как о односимвольных командах.

Иногда вы просто хотите напечатать символ, и вам не нужно, чтобы он действовал как магический символ. Есть способ использовать символ для представления самого себя, а не его специальной функции.

Мы покажем вам, какие символы являются «специальными» или «мета-» символами, а также как вы можете использовать их функционально и буквально.

~ Домашний каталог

Тильда (~) — это сокращение от вашего домашнего каталога. Это означает, что вам не нужно вводить полный путь к вашему домашнему каталогу в командах. Где бы вы ни находились в файловой системе, вы можете использовать эту команду, чтобы перейти в свой домашний каталог:

cd ~

Вы также можете использовать эту команду с относительными путями. Например, если вы находитесь где-то в файловой системе, которая не находится в вашей домашней папке, и хотите перейти в каталог archive в вашем каталоге work, используйте тильду, чтобы сделать это:

cd ~/work/archive

. Текущий каталог

Точка (.) представляет текущий каталог. Вы увидите его в списках каталогов, если используете параметр -a (все) с ls.

ls -a

Вы также можете использовать точку в командах для обозначения пути к вашему текущему каталогу. Например, если вы хотите запустить скрипт из текущего каталога, вы должны вызвать его следующим образом:

./script.sh

Это говорит Bash искать в текущем каталоге файл script.sh. Таким образом, он не будет искать в каталогах на вашем пути соответствующий исполняемый файл или скрипт.

.. Родительский каталог

Двойная точка или «двойная точка» (..) представляет собой родительский каталог вашего текущего. Вы можете использовать это, чтобы подняться на один уровень в дереве каталогов.

cd ..

Вы также можете использовать эту команду с относительными путями — например, если вы хотите подняться на один уровень вверх в дереве каталогов, а затем войти в другой каталог на этом уровне.

Вы также можете использовать эту технику для быстрого перехода к каталогу на том же уровне в дереве каталогов, что и текущий. Вы прыгаете на один уровень вверх, а затем снова спускаетесь в другой каталог.

cd ../gc_help

/ Разделитель каталогов пути

Вы можете использовать косую черту (/), которую часто называют просто косой чертой, для разделения каталогов в пути.

ls ~/work/archive

Одна косая черта представляет кратчайший возможный путь к каталогу. Поскольку все в дереве каталогов Linux начинается с корневого каталога, вы можете использовать эту команду для быстрого перехода в корневой каталог:

cd /

# Комментарий или обрезка строк

Чаще всего вы используете решетку или знак номера (#), чтобы сообщить оболочке, что следует за комментарием, и она не должна реагировать на него. Вы можете использовать его в сценариях оболочки и, что менее полезно, в командной строке.

# This will be ignored by the Bash shell

Однако на самом деле это не игнорируется, потому что оно добавляется в вашу историю команд.

Вы также можете использовать хэш, чтобы обрезать строковую переменную и удалить некоторый текст с самого начала. Эта команда создает строковую переменную с именем this_string.

В этом примере мы назначаем текст «Дэйв Гик!» к переменной.

this_string="Dave Geek!"

Эта команда использует echo для вывода слов «How-To» в окно терминала. Он извлекает значение, хранящееся в строковой переменной, посредством расширения параметра. Поскольку мы добавляем хэш и текст «Дэйв», эта часть строки обрезается до того, как она будет передана в echo.

echo How-To ${this_string#Dave}

Это не изменяет значение, хранящееся в строковой переменной; это влияет только на то, что отправляется в echo. Мы можем использовать echo, чтобы еще раз вывести значение строковой переменной и проверить это:

echo $this_string

? Подстановочный знак для одного символа

Оболочка Bash поддерживает три подстановочных знака, одним из которых является вопросительный знак (?). Вы используете подстановочные знаки для замены символов в шаблонах имен файлов. Имя файла, содержащее подстановочный знак, формирует шаблон, соответствующий диапазону имен файлов, а не одному.

Подстановочный знак вопросительного знака представляет ровно один символ. Рассмотрим следующий шаблон имени файла:

ls badge?.txt

Это переводится как «перечислите любой файл с именем, начинающимся с «значка», за которым следует любой символ перед расширением имени файла».

Он соответствует следующим файлам. Обратите внимание, что у некоторых есть цифры, а у некоторых есть буквы после «значка» в имени файла. Подстановочный знак вопросительного знака будет соответствовать как буквам, так и цифрам.

Однако этот шаблон имени файла не соответствует «значку.txt», потому что в имени файла нет ни одного символа между «значком» и расширением файла. Подстановочный знак вопросительного знака должен соответствовать соответствующему символу в имени файла.

Вы также можете использовать вопросительный знак, чтобы найти все файлы с определенным количеством символов в именах файлов. Здесь перечислены все текстовые файлы, которые содержат ровно пять символов в имени файла:

ls ?????.txt

* Подстановочный знак последовательности символов

Вы можете использовать подстановочный знак звездочки (*) для обозначения любой последовательности символов, включая без символов. Рассмотрим следующий шаблон имени файла:

ls badge*

Это соответствует всему следующему:

Он соответствует «badge.txt», потому что подстановочный знак представляет любую последовательность символов или отсутствие символов.

Эта команда соответствует всем файлам с именем «исходный» независимо от расширения файла.

ls source.*

[] Подстановочный знак набора символов

Как описано выше, вы используете вопросительный знак для представления любого отдельного символа и звездочку для представления любой последовательности символов (включая отсутствие символов).

Вы можете создать подстановочный знак с помощью квадратных скобок ( [] ) и символов, которые они содержат. Соответствующий символ в имени файла должен соответствовать по крайней мере одному из символов в наборе подстановочных знаков.

В этом примере команда переводится как «любой файл с расширением «.png», имя файла начинается с «pipes_0» и в котором следующим символом является либо 2, 4 или 6. ”

ls badge_0[246].txt

Вы можете использовать более одного набора скобок в шаблоне имени файла:

ls badge_[01][789].txt

Вы также можете включать диапазоны в набор символов. Следующая команда выбирает файлы с номерами от 21 до 25 и от 31 до 35 в имени файла.

ls badge_[23][1-5].txt

; Разделитель команд оболочки

Вы можете вводить в командной строке столько команд, сколько хотите, если вы разделяете каждую из них точкой с запятой (;). Мы сделаем это в следующем примере:

ls > count.txt; wc -l count.txt; rm count.txt

Обратите внимание, что вторая команда выполняется даже в случае сбоя первой, третья — даже в случае сбоя второй и т. д.

Если вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:

cd ./doesntexist && cp ~/Documents/reports/* .

& Фоновый процесс

После того, как вы наберете команду в окне терминала и она завершится, вы вернетесь в командную строку. Обычно это занимает минуту или две. Но если вы запустите другое приложение, например gedit, вы не сможете использовать окно терминала, пока не закроете приложение.

Однако вы можете запустить приложение в качестве фонового процесса и продолжать использовать окно терминала. Для этого достаточно добавить амперсанд в командную строку:

gedit command_address.page &

Bash показывает идентификатор запущенного процесса, а затем возвращает вас в командную строку. Затем вы можете продолжать использовать окно терминала.

< Перенаправление ввода

Многие команды Linux принимают файл в качестве параметра и берут свои данные из этого файла. Большинство этих команд также могут принимать данные из потока. Чтобы создать поток, вы используете левую угловую скобку (<), как показано в следующем примере, чтобы перенаправить файл в команду:

sort < words.txt

Когда в команду перенаправляется ввод, она может вести себя иначе, чем при чтении из именованного файла.

Если мы используем 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 в нижнем или верхнем регистре. grep передаст эти строки в sort. sort использует параметр -r (обратный), поэтому отсортированные результаты будут отображаться в обратном порядке.

Мы набрали следующее:

cat words.txt | grep [cC] | sort -r

! Конвейерное логическое НЕ и оператор истории

Восклицательный знак (!) — это логический оператор, означающий НЕ.

В этой командной строке есть две команды:

[ ! -d ./backup ] && mkdir ./backup

  • Первая команда — это текст в квадратных скобках;
  • Вторая команда — это текст, следующий за двойными амперсандами &&.

Первая команда использует ! как логический оператор. Квадратные скобки означают, что тест будет проведен. Параметр -d (каталог) проверяет наличие каталога с именем backup. Вторая команда создает каталог.

Поскольку две команды разделены двойным амперсандом, Bash выполнит вторую только в том случае, если первая выполнится успешно. Однако это противоположно тому, что нам нужно. Если проверка каталога «backup» прошла успешно, нам не нужно его создавать. И если тест для «резервного» каталога не пройден, вторая команда не будет выполнена, и отсутствующий каталог не будет создан.

Здесь на помощь приходит логический оператор !. Он действует как логическое НЕ. Таким образом, если тест проходит успешно (т. е. каталог существует), ! переворачивает его на «НЕ успешно», что является неудачей. Итак, вторая команда не активирована.

Если проверка каталога не удалась (т. е. каталог не существует), ! меняет ответ на «НЕ ошибка», что означает успешно. Итак, команда создания отсутствующего каталога выполнена.

Этот маленький ! выдает много энергии, когда вам это нужно!

Чтобы проверить состояние папки резервного копирования, вы используете команду ls и параметры -l (длинный список) и -d (каталог) , как показано ниже:

ls -l -d backup

Вы также можете запускать команды из истории команд с восклицательным знаком. Команда history отображает историю команд, а затем вы вводите номер команды, которую хотите повторно запустить с помощью !, чтобы выполнить ее, как показано ниже:

!24

Следующая команда повторно запускает предыдущую команду:

!!

$Переменные выражения

В оболочке Bash вы создаете переменные для хранения значений. Некоторые из них, такие как переменные среды, существуют всегда, и вы можете получить к ним доступ в любое время, когда открываете окно терминала. Они содержат такие значения, как ваше имя пользователя, домашний каталог и путь.

Вы можете использовать echo, чтобы увидеть значение, которое содержит переменная — просто перед именем переменной поставьте знак доллара ($), как показано ниже:

echo $USER
echo $HOME
echo $PATH

Чтобы создать переменную, вы должны дать ей имя и указать значение, которое она будет хранить. Вам не нужно использовать знак доллара для создания переменной. Вы добавляете $ только при ссылке на переменную, как в следующем примере:

ThisDistro=Ubuntu
MyNumber=2001
echo $ThisDistro
echo $MyNumber

Добавьте фигурные скобки ( {} ) вокруг знака доллара и выполните расширение параметра, чтобы получить значение переменной и разрешить дальнейшие преобразования значения.

Это создает переменную, содержащую строку символов, как показано ниже:

MyString=123456qwerty

Используйте следующую команду, чтобы вывести строку в окно терминала:

echo ${MyString}

Чтобы вернуть подстроку, начинающуюся с позиции 6 всей строки, используйте следующую команду (есть нулевое смещение, поэтому первая позиция равна нулю):

echo ${myString:6}

Если вы хотите отобразить подстроку, начинающуюся с нулевой позиции и содержащую следующие шесть символов, используйте следующую команду:

echo ${myString:0:6}

Используйте следующую команду, чтобы отобразить подстроку, начинающуюся с четвертой позиции и содержащую следующие четыре символа:

echo ${myString:4:4}

Цитирование специальных символов

Если вы хотите использовать специальный символ в качестве буквального (неспециального) символа, вы должны сообщить об этом оболочке Bash. Это называется цитированием, и есть три способа сделать это.

Если вы заключите текст в кавычки («…»), это не позволит Bash воздействовать на большинство специальных символов, и они просто печатаются. Однако одним заметным исключением является знак доллара ($). Он по-прежнему функционирует как символ для переменных выражений, поэтому вы можете включать значения переменных в свой вывод.

Например, эта команда печатает дату и время:

echo "Today is $(date)"

Если вы заключите текст в одинарные кавычки (…), как показано ниже, он остановит функцию всех специальных символов:

echo 'Today is $(date)'

Вы можете использовать обратную косую черту (\), чтобы следующий символ не функционировал как специальный символ. Это называется «сбежать» от персонажа; см. пример ниже:

echo "Today is \$(date)"

Просто подумайте о специальных символах как об очень коротких командах. Если вы запомните их использование, это может значительно улучшить ваше понимание оболочки Bash и сценариев других людей.

RELATED: Best Linux Laptops for Developers and Enthusiasts