linux streams

echo

Вывод строки в стандартный поток вывода

Описание

echo — одна из базовых утилит Unix, предназначенная для вывода текстовых строк в стандартный поток вывода (stdout). Команда присутствует в каждой Unix-подобной системе и является встроенной в большинство оболочек (bash, zsh, sh). История команды восходит к первым версиям Unix 1970-х годов, и с тех пор она остаётся неизменным инструментом для отладки, скриптования и формирования текстового вывода.

Помимо простого вывода текста, echo активно используется в скриптах для отображения сообщений пользователю, записи строк в файлы через перенаправление, передачи данных в пайп другим командам. С флагом -e поддерживает управляющие последовательности: переносы строк (\n), табуляции (\t), изменение цвета через ANSI-коды.

Важно понимать разницу между встроенным echo оболочки и внешней утилитой /bin/echo: их поведение по отношению к флагам и escape-последовательностям может различаться. Для переносимых скриптов часто рекомендуют printf вместо echo.

Синтаксис

echo [OPTION]... [STRING]...
# Примеры синтаксиса echo "Hello, World!" echo -n "No newline at end" echo -e "Line1\nLine2\tTabbed" echo "Value: $HOME" # раскрывает переменную echo 'Value: $HOME' # одинарные кавычки — без раскрытия

Флаги и опции

Флаг Описание Пример
-n Не добавлять символ новой строки в конце echo -n "no newline"
-e Включить интерпретацию escape-последовательностей (\n, \t, \\ и др.) echo -e "a\nb"
-E Отключить интерпретацию escape-последовательностей (поведение по умолчанию) echo -E "a\nb"
\n Новая строка (требует -e) echo -e "line1\nline2"
\t Горизонтальная табуляция (требует -e) echo -e "col1\tcol2"
\r Возврат каретки (требует -e) echo -e "text\r"
\\ Обратный слэш (требует -e) echo -e "path\\file"
\a Звуковой сигнал (bell, требует -e) echo -e "\a"
\0NNN Символ с восьмеричным кодом NNN (требует -e) echo -e "\041"
\xHH Символ с шестнадцатеричным кодом HH (требует -e) echo -e "\x41"

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

Запись в файл

echo "Hello" > file.txt        # перезапись
echo "More text" >> file.txt   # добавление
echo -e "line1\nline2" > file.txt

Вывод переменных

NAME="Alice"
echo "Hello, $NAME!"
echo "Home: $HOME"
echo "Path: ${PATH}"

Цветной вывод (ANSI)

echo -e "\e[32mGreen text\e[0m"
echo -e "\e[31mError!\e[0m"
echo -e "\e[1mBold text\e[0m"
echo -e "\e[33mWarning\e[0m"

Передача в пайп

echo "hello world" | tr 'a-z' 'A-Z'
echo "  text  " | tr -d ' '
echo "user:pass" | cut -d: -f1

Отладка скриптов

echo "DEBUG: var=$var"
echo "Step 1: starting process..."
echo "Exit code: $?"

Создание heredoc-контента

echo "#!/bin/bash" > script.sh
echo "echo 'Auto-generated'" >> script.sh
chmod +x script.sh

Советы и предупреждения

Совет: Используйте printf вместо echo в переносимых скриптах — его поведение одинаково во всех оболочках: printf "Hello, %s!\n" "$NAME"
Совет: Одинарные кавычки предотвращают раскрытие переменных и подстановку команд: echo '$HOME' выведет буквально $HOME, а не путь.
Совет: Для ANSI-цветов используйте переменные: RED='\e[31m'; NC='\e[0m'; echo -e "${RED}Error${NC}"
Внимание: Поведение echo -e различается между встроенным echo оболочки и /bin/echo. В скриптах явно указывайте интерпретатор (#!/bin/bash) или используйте printf.
Внимание: Не используйте echo для вывода произвольных пользовательских данных без кавычек — это может привести к неожиданному поведению если данные содержат специальные символы (-e, -n).