- Команда echo в Linux
- Команда echo linux
- Примеры работы echo
- Выводы
- Как использовать коды завершения в Bash-скриптах
- Что такое коды завершения
- Что происходит, когда коды завершения не определены
- Как использовать коды завершения в Bash-скриптах
- Проверяем коды завершения
- Создаём собственный код завершения
- Как использовать коды завершения в командной строке
- Дополнительные коды завершения
- Оформление вывода в shell-сценариях
- Коварное эхо
- Да будет цвет!
- Что еще могут esc-последовательности?
- tput, termcap и terminfo
Команда echo в Linux
Команда echo — это очень простая и в то же время часто используемая встроенная команда оболочки Bash. Она имеет только одно назначение — выводить строку текста в терминал, но применяется очень часто в различных скриптах, программах, и даже для редактирования конфигурационных файлов.
В этой статье мы рассмотрим что представляет из себя команда echo linux, как ее можно использовать и в каких ситуациях. Но сначала рассмотрим синтаксис самой команды.
Команда echo linux
Команда echo — это не системная утилита, у нее нет исполняемого файла. Она существует только внутри интерпретатора Bash. Синтаксис команды echo linux очень прост:
$ echo опции строка
Опций всего несколько, давайте рассмотрим их, чтобы вы могли лучше ориентироваться в работе утилиты:
- -n — не выводить перевод строки;
- -e — включить поддержку вывода Escape последовательностей;
- -E — отключить интерпретацию Escape последовательностей.
Это все опции, если включена опция -e, то вы можете использовать такие Escape последовательности для вставки специальных символов:
- /c — удалить перевод строки;
- /t — горизонтальная табуляция;
- /v — вертикальная табуляция;
- /b — удалить предыдущий символ;
- /n — перевод строки;
- /r — символ возврата каретки в начало строки.
Пожалуй, это все, что нужно знать о команде echo, а теперь давайте рассмотрим как с ней работать.
Примеры работы echo
Давайте рассмотрим как пользоваться echo. Сначала просто выведем строку на экран:
echo Linux Open Source Software Technologies
Также можно вывести значение переменной. Сначала объявим переменную:
Затем выведем ее значение:
echo Наш сайт $VAR
Как уже говорилось, с помощью опции -e можно включить интерпретацию специальных последовательностей. Последовательность \b позволяет удалить предыдущий символ. Например, удалим все пробелы из строки:
echo -e «Linux \bopen \bsource \bsoftware \btechnologies»
Последовательность \n переводит курсор на новую строку:
echo -e «Linux \nopen \nsource \nsoftware \ntechnologies»
С помощью \t вы можете добавить горизонтальные табуляции:
echo -e «Linux \topen \tsource \tsoftware \ttechnologies»
Можно совместить переводы строки и табуляции:
echo -e «Linux \tnopen \tnsource \tnsoftware \tntechnologies»
Точно так же можно применить вертикальную табуляцию:
echo -e «Linux \vopen \vsource \vsoftware \vtechnologies»
С помощью последовательности \r можно удалить все символы до начала строки:
echo -e «Linux \ropen source software technologies»
Последовательность -c позволяет убрать перевод на новую строку в конце сообщения:
echo -e «Linux open source software technologies\c»
Дальше — больше. Вы можете разукрасить вывод echo с помощью последовательностей управления цветом Bash. Для доступны такие цвета текста:
- \033[30m — чёрный;
- \033[31m — красный;
- \033[32m — зелёный;
- \033[33m — желтый;
- \033[34m — синий;
- \033[35m — фиолетовый;
- \033[36m — голубой;
- \033[37m — серый.
И такие цвета фона:
- \033[40m — чёрный;
- \033[41m — красный;
- \033[42m — зелёный;
- \033[43m — желтый;
- \033[44m — синий;
- \033[45m — фиолетовый;
- \033[46m — голубой;
- \033[47m — серый;
- \033[0m — сбросить все до значений по умолчанию.
Например. раскрасим нашу надпись в разные цвета:
echo -e «\033[35mLinux \033[34mopen \033[32msource \033[33msoftware \033[31mtechnologies\033[0m»
С основными параметрами команды echo разобрались, теперь рассмотрим еще некоторые специальные символы bash. Вы можете вывести содержимое текущей папки просто подставив символ *:
Также можно вывести файлы определенного расширения:
Я уже говорил, что echo можно использовать для редактирования конфигурационных файлов. Вы можете использовать запись echo в файл linux, если он пуст:
echo 1 > /proc/sys/net/ipv4/ip_forward
Если файл не пуст, и вам необходимо добавить свою строчку в конец файла используйте символ перенаправления вывода >>:
echo «UUID=09ec0871-2f55-4dd5-aeb2-cacc4a67907c /var/tmp btrfs subvol=@/var/tmp 0 0» >> /etc/fstab
Если строка содержит какие-либо специальные символы или может быть понята интерпретатором неоднозначно, следует заключить ее в кавычки.
Выводы
В этой статье была рассмотрена команда echo linux. Несмотря на свою простоту, она может применяться для решения различных задач и незаменима при написании простых скриптов. Надеюсь, эта информация была вам полезной.
Источник
Как использовать коды завершения в Bash-скриптах
Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.
Что такое коды завершения
В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.
Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.
Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.
Что происходит, когда коды завершения не определены
В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.
Этот скрипт запускает команды touch и echo . Если запустить этот скрипт без прав суперпользователя, команда touch не выполнится. В этот момент мы хотели бы получить информацию об ошибке с помощью соответствующего кода завершения. Чтобы проверить код выхода, достаточно ввести в командную строку специальную переменную $? . Она печатает код возврата последней запущенной команды.
Как видно, после запуска команды ./tmp.sh получаем код завершения 0 . Этот код говорит об успешном выполнении команды, хотя на самом деле команда не выполнилась. Скрипт из примера выше исполняет две команды: touch и echo . Поскольку код завершения не определён, получаем код выхода последней запущенной команды. Это команда echo , которая успешно выполнилась.
Если убрать из скрипта команду echo , можно получить код завершения команды touch .
Поскольку touch в данном случае — последняя запущенная команда, и она не выполнилась, получаем код возврата 1 .
Как использовать коды завершения в Bash-скриптах
Удаление из скрипта команды echo позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch ? Речь идёт о печати stdout в случае успеха и stderr в случае неуспеха.
Проверяем коды завершения
Выше мы пользовались специальной переменной $? , чтобы получить код завершения скрипта. Также с помощью этой переменной можно проверить, выполнилась ли команда touch успешно.
После рефакторинга скрипта получаем такое поведение:
- Если команда touch выполняется с кодом 0 , скрипт с помощью echo сообщает об успешно созданном файле.
- Если команда touch выполняется с другим кодом, скрипт сообщает, что не смог создать файл.
Любой код завершения кроме 0 значит неудачную попытку создать файл. Скрипт с помощью echo отправляет сообщение о неудаче в stderr .
Создаём собственный код завершения
Наш скрипт уже сообщает об ошибке, если команда touch выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0 .
Поскольку скрипт завершился с ошибкой, было бы не очень хорошей идеей передавать код успешного завершения в другую программу, которая использует этот скрипт. Чтобы добавить собственный код завершения, можно воспользоваться командой exit .
Теперь в случае успешного выполнения команды touch скрипт с помощью echo сообщает об успехе и завершается с кодом 0 . В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1 .
Как использовать коды завершения в командной строке
Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.
В примере выше && используется для обозначения «и», а || для обозначения «или». В данном случае команда выполняет скрипт ./tmp.sh , а затем выполняет echo «bam» , если код завершения 0 . Если код завершения 1 , выполняется следующая команда в круглых скобках. Как видно, в скобках для группировки команд снова используются && и || .
Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.
Дополнительные коды завершения
Команда exit принимает числа от 0 до 255 . В большинстве случаев можно обойтись кодами 0 и 1 . Однако есть зарезервированные коды, которые обозначают конкретные ошибки. Список зарезервированных кодов можно посмотреть в документации.
Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.
Источник
Оформление вывода в shell-сценариях
В этой заметке будут обсуждаться:
- сюрпризы, которые может нам преподнести команда echo (читается как эхо);
- способы «расцвечивания» результатов работы наших сценариев;
- возможности управления перемещением курсора, очисткой экрана, раздвижкой и сдвижкой строк;
- использование и назначение программы tput и баз данных termcap и terminfo.
Коварное эхо
Однако, в 70-е годы прошлого века не все было так одназначно. Существовал один филосовский вопрос. Суть его была такова: что должна делать команда echo, если ей не передали аргументов, в частности, следует ли ей выдавать пустую строку или вообще ничего не предпринимать? По этому поводу велись большие дебаты. Такие, что вдохновили Дуга МакИлроя /Doug McIlroy/ сочинить притчу, которая приведена ниже.
UNIX и эхо.
Жила-была в стране Нью-Джерси, прекрасная девушка UNIX, к которой приезжали издалека, чтобы полюбоваться ею. Ослепленные чистотой UNIX, все искали ее руки и сердца: одни за изящество, другие за изысканную вежливость, третьи за проворность при выполнении самых изнурительных заданий. Была она от рождения столь великодушна и услужлива, что все женихи остались довольны ею, а ее многочисленное потомство распространилось во все концы земли.
Сама природа покровительствовала UNIX и вторила ей более охотно, чем кому-либо из смертных. Простые люди поражались ее эхом, таким оно было точным и кристально чистым. Они не могли поверить, что ей отвечают те же леса и скалы, которые так искажают их собственные голоса. Когда один нетерпеливый пастушок попросил UNIX: «Пусть эхо ответит ничего», и она послушно открыла рот, эхо промолчало. «Зачем ты открываешь рот? спросил пастушок. Отныне никогда не открывай его, если эхо должно ответить ничего!». и UNIX подчинилась.
«Но я хочу совершенного исполнения, даже если эхо отвечает ничего, потребовал другой, обидчивый, юноша, а никакого совершенного эха не получится при закрытом рте». Не желая обидеть никого из них, UNIX согласилась говорить разные «ничего» для нетерпеливого и обидчивого юношей. Она называла «ничего» для обидчивого как ‘\n’. Однако теперь, когда она говорила ‘\n’, на самом деле она не произносила ничего, поэтому ей приходилось открывать рот дважды: один раз, чтобы сказать ‘\n’, и второй раз, чтобы не сказать ничего. Это не понравилось обидчивому юноше, который тотчас сказал: «Для меня ‘\n’ звучит, как настоящее «ничего», но когда ты открываешь рот второй раз, то все портишь. Возьми второе «ничего» назад». Услужливая UNIX согласилась отказаться от некоторых эхо и обозначила это как ‘\с’. С тех пор обидчивый юноша мог услышать совершенное эхо «ничего», если он задавал ‘\n’ и ‘\с’ вместе, но говорят, что он так и не услышал его, поскольку умер от излишеств в обозначениях. [1]
Хотя все настоящие реализации этой команды выдают пустую строку, это еще не значит, что проблемы закончились. Давайте их рассмотрим. Рекомендую все, о чем я буду рассказывать, проверить на практике, сидя за консолью. Так будет легче разобраться.
Уже в 7-ой редакции UNIX echo распознавала флаг -n, который подавлял вывод завершающего символа перевода строки:
$ echo -n Seven Edition
Seven Edition$
В System V, где команда echo умеет интерпретировать упраляющие последовательности вида \Х, для подавления вывода завершающего символа перевода строки используют обозначение \с. Поэтому вызвав echo с аргументом -n вы можете получить не совсем то, что ожидали:
$ echo -n System V
-n System V
$
В Linux же, echo не желает обрабатывать последовательности вида \Х:
$ echo Linux\\с
Linux \с
$
до тех пор, пока вы не зададите ей флаг -e:
$ echo -e Linux\\с
Linux$
Можно воспользоваться и флагом -n, echo из Linux его понимает.
Добавляет путаницы и то, что почти всегда shell имеет встроенную команду echo, поведение которой может отличаться от внешней /bin/echo. Кроме того, в системе может оказаться не одна echo, а парочка. В таком случае, второе echo обычно находится где-нибудь в районе /usr/ucb/. Из-за таких различий в реализации echo возникают определенные трудности при переносе сценариев из системы в систему. Есть ли способ их избежать? Конечно, но это уже другая история.
Да будет цвет!
Перед тем как перейти к детальному рассмотрению esc-последовательностей, давайте вначале научимся вводить символ esc с клавиатуры (если вы умеете это делать, то можете переходить к выполению примеров из следующего абзаца). Чтобы ввести с клавиатуры код любой «непечатной», т. е. управляющей клавиши (функциональной, стрелки и т. п.), необходимо нажать Ctrl+V, а затем интересующую вас «кнопку». Этот прием будет работать не только в командной строке, но и в текстовом редакторе vi.
Проверим на практике. Выполним команду echo «Ctrl+V,Esc[30;40m»;clear (на экране символ esc будет показан как ^[):
$ echo «^[[30;40m»;clear
Если вы все сделали правильно, то приобретайте прибор ночного видения :)! Пожалуй я не ошибусь, предположив, что у вас возникли вопросы:
А что это за числа? К чему они ведут? «А вдруг они не курят, а вдруг они не пьют?» [2]
Числа 30 и 40 это аргументы команды esc[ n m. При необходимости указать несколько аргументов, их перечисляют через точку с запятой: esc[ n1 ; n2 ;. m. В зависимости от значения n результаты будут следующими: Теперича, имея в своем распоряжении такую табличку, можете приступать к получению «синих экранов», «красных квадратов» и прочей творческой работе. В которой желаю вам всяческих успехов (тем кто предпочитает другие слова удачи).
Что еще могут esc-последовательности?
Проведем испытания. Начнем с подготовки рабочего пространства. Выполните команду clear (или просто нажмите Ctrl+L). Затем более хитрую (напомню, что символы ^[ появляются в результате нажатия клавиш Ctrl+L,Esc): Переходим к «разбору полетов». Как вы видите, esc-последовательность ^[[10;10H переместила курсор в 10-ю позицию 10-й строки экрана и начиная с этой позиции был осуществлен вывод символов abc. Потом esc-последовательность ^[[5d переместила курсор немного назад в 5-ю строку, неизменив его позиции в строке. После этого echo напечатала символы XYZ и вывела завершающий символ перевода строки. Поэтому-то приглашение командного интерпретатора в виде у.е. появилось в следующей (шестой) строке.
tput, termcap и terminfo
Наведение порядка в этом «зоосаде» обеспечивают два компонента UNIX: база данных и библиотека подпрограмм. В первом описаны поддерживаемые терминалом функции, а второй используется для выполнения запросов к базе данных. Каждый тип терминала в этой базе имеет свое название и перечень его свойств. Изначально эта информация хранилась в файле termcap (от terminal capabilities возможности терминала). C годами termcap очень вырос и в семействе AT&T юниксов превратился в базу данных terminfo. В ней, чтобы не хранить всю информацию в одном большом файле, описание каждого терминала компилируется и сохраняется в отдельном файле.
Свойствами терминала могут быть:
- общие характеристики терминала, например количество строк и число позиций в строке
- коды, которые нужно выводить на экран для управления курсором, очистки экрана или его части, смены цветов, атрибутов отображения и т. п.
- коды, которые генерируют управляющие клавиши терминала
Названия свойств стандартизированы и неизменны (почти:), а их значения наоборот изменяются в зависимости от типа терминала. В качестве примера ниже приведено несколько стандартных обозначений характеристик терминалов:
termcap | terminfo | |
число символов в строке | co | cols |
число строк на экране | li | lines |
очистить экран | сl | clear |
включить повышенную яркость | md | bold |
включить мигание | mb | blink |
включить реверсное отображение | mr | rev |
установить цвет символов | AF | setaf |
установить цвет фона | AB | setab |
переместить курсор | cm | cup |
подать звуковой сигнал | bl | bel |
Более подробную информацию можно получить в манах по termcap и terminfo.
Таким образом, когда программе нужна информация о возможностях терминала, она определяет тип используемого терминала по значению переменной окружения TERM , затем обращается к базе данных и получает соответствующее типу терминала описание, которое и использует в дальнейшем для управления вводом/выводом.
Что же делать, если у вас возникло желание написать сценарий, который работал бы с любым, поддерживаемым операцинной системой, терминалом с одинаковой (или уменьшенной) функциональностью? Попробуйте воспользоваться утилитой tput. Синтаксис у нее следующий:
tput [-T тип_терминала] название_свойства [параметр(ы) . ]
В качестве значения аргумента название_свойства может быть задано любое имя из списка свойств базы данных termcap и/или terminfo для терминала указанного в тип_терминала. Если этот аргумент опущен, то tput будет использовать значение переменной TERM .
Для кодирования цветов используются следующие числа (в скобках указываются цвета для режима повышенной яркости):
Однако, не все так просто в нашем королевстве. Будьте готовы к тому, что в одних системах (BSD) tput будет ожидать название_свойства в стиле termcap, а в других (System V) в стиле terminfo. Примеры:
Всем, кто хочет изучить материальную часть более предметно, рекомендую поэкспериментировать с утилитами, которые конвертируют записи базы terminfo в termcap и наоборот. В BSD-системах это tconv, а в Linux и юниксах ветви AT&T infocmp. Вот вам еще примерчики:
Конечно же, существует много случаев, когда использование esc-последовательностей напрямую оправдано. Приведу в качестве примера фрагмент файла /etc/rc.status дистрибутива SuSE Linux (комментарии мои):
И небольшое замечание относительно ДОСа. Помните такую ОС? Так вот, если к ней прикрутить стандартный драйвер ANSI.SYS, то все вышеперечисленные esc-последовательности будут работать и там. 1. Брайан Керниган, Роб Пайк
UNIX универсальная среда программирования
М.: Финансы и статистика, 1992
2. Слова из песни, которые как известно не выбросишь.
Источник