Выполните упражнение 2.13.
Упражнение 2.13. Команда точка
В следующем примере команда "точка" применяется в командной строке, но с таким же успехом вы можете использовать ее и в сценарии.
1. Предположим, что у вас есть два файла, содержащие параметры окружения для двух разных сред разработки. Для установки окружения, предназначенного для старых классических команд, classic_set, можно применить следующий программный код.
#!/bin/sh
version=classic
PATH=/usr/local/old_bin:/usr/bin:/bin:
.
PS1="classic> "
2. Для новых команд применяется latest_set.
#!/bin/sh
version=latest
PATH=/usr/local/new_bin:/usr/bin:/bin:
.
PS1=" latest version> "
Вы можете установить окружение, применяя эти сценарии в сочетании с командой "точка", как показано в следующей порции примера.
$ . ./classic_set
classic> echo $version
classic
classic> . /latest_set
latest version> echo $version
latest
latest version>
Как это работает
Сценарии выполняются, используя команду "точка", поэтому каждый из них выполняется в текущей командной оболочке. Это позволяет сценарию изменять параметры окружения в текущей оболочке, которая сохраняет изменения даже после того, как сценарий завершился.
echo
Несмотря на призыв группы Х/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
Команда eval позволяет вычислять аргументы. Она встроена в командную оболочку и обычно не представлена как отдельная команда. Лучше всего ее действие демонстрирует короткий пример, позаимствованный непосредственно из стандарта X/Open.
foo=10
x=foo
у='$'$х
echo $у
Будет выведено $foo. Однако код
foo=10
x=foo
eval у='$'$х
echo $у
выведет на экран 10. Таким образом, evalнемного похожа на дополнительный знак $: она возвращает значение значения переменной.
Команда evalочень полезна, т.к. позволяет генерировать и выполнять код на лету. Применение этой команды усложняет отладку сценария, но разрешает делать то, что в противном случае выполнить сложно или даже невозможно.
exec
У команды execдва варианта применения. Обычно ее используют для замены текущей командной оболочки другой программой.
Например, строка
exec wall "Thanks for all the fish"
в сценарии заменит текущую оболочку командой wall. Строки, следующие за командой exec, не обрабатываются, потому что командная оболочка, выполнявшая сценарий, больше не существует.
Второй вариант применения exec— модификация текущих дескрипторов файлов.
exec 3< afile
Эта команда открывает файловый дескриптор 3 для чтения из файла afile. Этот вариант редко используется.
exit n
Команда exitвызывает завершение сценария с кодом завершения n . Если вы примените ее в строке подсказки или приглашения любой интерактивной командной оболочки, она приведет к вашему выходу из системы. Если разрешить сценарию завершиться без указания кода завершения, статус последней выполненной в сценарии команды используется как возвращаемое значение. Задание кода завершения считается хорошим стилем программирования.
Читать дальше