Несмотря на призыв группы Х/Open применять в современных командных оболочках команду printf
, мы будем продолжать следовать общепринятой практике использования команды echo
для вывода строки с последующим переходом на новую строку.
При этом возникает общая проблема: удаление символа перехода на новую строку. К сожалению, в разных версиях ОС UNIX реализованы разные решения. В ОС Linux общепринятый метод
echo -n "string to output"
Но вы часто будете сталкиваться и с вариантом
echo -е "string to output\c"
Второй вариант echo -е
рассчитан на то, что задействована интерпретация символов escape-последовательности, начинающихся с обратного слэша, таких как \c
для подавления новой строки, \t
для вывода табуляции, \n
для вывода символов возврата каретки. В более старых версиях bash этот режим установлен по умолчанию, а в более современных версиях интерпретация символов escape-последовательностей с обратным слэшем отключена. Подробные сведения о поведении вашего дистрибутива ищите на страницах интерактивного справочного руководства.
Если вам нужен легко переносимый способ удаления завершающей новой строки, для избавления от нее можно воспользоваться внешней командой tr
, но она будет выполняться немного медленнее. Если вашим системам UNIX нужна переносимость и нужно избавиться от завершающей новой строки, как правило, лучше придерживаться команды printf
. Если ваши сценарии предназначены для работы только в ОС Linux и bash, вполне подойдет echo -n
, хотя, возможно, придется начинать файл со строки #!/bin/bash
для того, чтобы в явной форме показать, что вы рассчитываете на поведение в стиле bash.
Команда eval позволяет вычислять аргументы. Она встроена в командную оболочку и обычно не представлена как отдельная команда. Лучше всего ее действие демонстрирует короткий пример, позаимствованный непосредственно из стандарта X/Open.
foo=10
x=foo
у='$'$х
echo $у
Будет выведено $foo
. Однако код
foo=10
x=foo
eval у='$'$х
echo $у
выведет на экран 10. Таким образом, eval
немного похожа на дополнительный знак $
: она возвращает значение значения переменной.
Команда eval
очень полезна, т.к. позволяет генерировать и выполнять код на лету. Применение этой команды усложняет отладку сценария, но разрешает делать то, что в противном случае выполнить сложно или даже невозможно.
У команды exec
два варианта применения. Обычно ее используют для замены текущей командной оболочки другой программой.
Например, строка
exec wall "Thanks for all the fish"
в сценарии заменит текущую оболочку командой wall
. Строки, следующие за командой exec
, не обрабатываются, потому что командная оболочка, выполнявшая сценарий, больше не существует.
Второй вариант применения exec
— модификация текущих дескрипторов файлов.
exec 3< afile
Эта команда открывает файловый дескриптор 3 для чтения из файла afile. Этот вариант редко используется.
Команда exit
вызывает завершение сценария с кодом завершения
.
При программировании сценариев в командной оболочке код завершения 0 — успешное завершение сценария, коды от 1 до 125 включительно — коды ошибок, которые можно использовать в сценариях. Оставшиеся значения зарезервированы в соответствии с табл. 2.5.
Код завершения | Описание |
---|---|
126 | Файл не является исполняемым |
127 | Команда не найдена |
128 и выше | Появившийся сигнал |
Многим программистам на языках С и С++ использование нуля как признака успешного завершения может показаться несколько необычным. Большое преимущество сценариев — возможность применения 125 кодов ошибок, определенных пользователем, и отсутствие необходимости в глобальной переменной для хранения кода ошибки.
Далее приведен простой пример, возвращающий код успешного завершения, если в текущем каталоге существует файл с именем .profile.
#!/bin/sh
if [ -f .profile ]; then