Найти в Дзене
Эникей на передержке

`echo` для чайников | Linux 🐧

Пожалуй, каждый на первых этапах знакомства с терминалом Linux использовал команду echo, например: echo "Hello, Linux!" echo — это утилита в составе GNU coreutils или командной оболочки, например, bash. Предназначена для вывода строк в stdout. echo [ПАРАМЕТР] [СТРОКА] В случае использования утилиты в составе GNU coreutils (/bin/echo) добавляются ещё 2 параметра: При использовании параметра -e будут распознаны следующие последовательности: Выполним в терминале команды: echo "Hello, world!" echo -n "Enter your name: "; read В первом случае после вывода Hello, world! будет выполнен перенос строки, во втором - нет, т.е. приглашение командной строки будет следовать сразу за выводом: Второй вариант удобен в случаях, когда нам нужно оставить курсор на той же строке или когда программа, считывающая данные из стандартного потока ввода чувствительна к любым символам. Например, вычисляя хэш-сумму, можно забыть про перенос строки после вывода echo и погрязнуть в траблшутинге: Для максимального о
Оглавление

Пожалуй, каждый на первых этапах знакомства с терминалом Linux использовал команду echo, например:

echo "Hello, Linux!"

Описание

echo — это утилита в составе GNU coreutils или командной оболочки, например, bash. Предназначена для вывода строк в stdout.

Синтаксис

echo [ПАРАМЕТР] [СТРОКА]

Параметры

  • -n — не добавлять в конец вывода перевод на новую строку;
  • -E — отключить интерпретацию управляющих последовательностей (действие по умолчанию);
  • -e — включить интерпретацию управляющих последовательностей.

В случае использования утилиты в составе GNU coreutils (/bin/echo) добавляются ещё 2 параметра:

  • --help — справка;
  • --version — информация об используемой версии.

Список управляющих последовательностей

При использовании параметра -e будут распознаны следующие последовательности:

  • \\ — бэкслеш (обратная косая черта);
  • \a — звуковой сигнал;
  • \b — эмуляция Backspace (будет удалён символ перед последовательностью);
  • \c — подавить дальнейший вывод (в том числе перенос строки в конце вывода);
  • \e — Escape (для управляющих символов ANSI, которые используются для изменения формата, цвета и других параметров вывода);
  • \f — продолжить вывод с новой страницы (в командной оболочке может вести себя как вертикальная табуляция;
  • \n — продолжить вывод с новой строки;
  • \r — возврат курсора в начало строки;
  • \t — табулировать горизонтально (отступ вправо на 4 или 8 позиций);
  • \u (\U) — вставить символ юникода;
  • \v — табулировать вертикально (перейти на следующую строку и сделать отступ вправо равный количеству символов в предыдущей строке);
  • \0NNN — байт с восьмеричным значением NNN (от 1 до 3 цифр);
  • \xHH — байт с шестнадцатеричным значением HH (от 1 до 2 цифр).

Примеры использования

Перевод на новую строку после вывода

Выполним в терминале команды:

echo "Hello, world!"
echo -n "Enter your name: "; read

В первом случае после вывода Hello, world! будет выполнен перенос строки, во втором - нет, т.е. приглашение командной строки будет следовать сразу за выводом:

Разница вывода без и с параметром -n
Разница вывода без и с параметром -n

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

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

Разница хэш-сумм из-за перевода на новую строку по умолчанию в первом случае
Разница хэш-сумм из-за перевода на новую строку по умолчанию в первом случае

Интерпретация управляющих последовательностей

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

PURPLE='\e[38;5;5m'
CYAN='\033[38;5;14m'
DEEP_YELLOW='\u001b[38;5;220m'
YELLOW='\e[38;5;190m'
WHITE='\x1B[38;5;15m'
RUSTY='\033[38;5;9m'

\e[, \033[, \u001b[, \x1B[ означают одно и то же — префиксы Escape-последовательностей ANSI.
38 и 5 означают, что тексту (5) будет задан один из 256 цветов палитры (38).
5m, 9m, 14m, 15m, 190m, 220m — идентификаторы цветов из палитры.

Выведем пример цикла:

echo -e "${PURPLE}for ${CYAN}number ${PURPLE}in ${DEEP_YELLOW}{${YELLOW}1..10${DEEP_YELLOW}}${WHITE};\n\
${PURPLE}do\n\
\e[4C${YELLOW}echo ${RUSTY}\"Число: ${CYAN}\$number${RUSTY}\"\v\r\
${PURPLE}done"

Здесь, пожалуй, стоит пояснить что делают последовательности \e[4C и \v\r.

Первая служит для отступа от начала строки на 4 позиции, а вторая выполняет вертикальную табуляцию и возвращает курсор в начало строки, что эквивалентно \n.

Пример вывода с использованием управляющих последовательностей
Пример вывода с использованием управляющих последовательностей

Заключение

На этом рассмотрение возможностей echo подошло к концу. Желающим углубиться в ANSI Escape Sequences могу посоветовать статью: "`echo` на максималках | Escape последовательности | Linux 🐧"

Исходный код и полная документация команды echo доступны на ресурсах проекта GNU.

Если статья была полезна, поставьте лайк или подпишитесь на канал, чтобы чаще видеть в ленте подобный контент. Всем добра!)