Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 13 декабря 2014 г.

Глава 13. Встраивание и параметры командных оболочек

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

Встраивание командных оболочек

Командные оболочки могут подвергаться встраиванию в рамках строк команд или, другими словами, в ходе разбора строк команд могут создаваться новые процессы, являющиеся копиями процесса текущей командной оболочки. Вы можете использовать переменные для доказательства факта создания новых командных оболочек. В примере ниже переменная $var1 существует исключительно в рамках дочерней (временной) командной оболочки.
[paul@RHELv4u3 gen]$ echo $var1

[paul@RHELv4u3 gen]$ echo $(var1=5;echo $var1)
5
[paul@RHELv4u3 gen]$ echo $var1

[paul@RHELv4u3 gen]$

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

В примере ниже демонстрируется работа встроенной командной оболочки, функционирующей в рамках другой встроенной командной оболочки.
paul@deb503:~$ A='командная оболочка'
paul@deb503:~$ echo $C$B$A $(B='встроенная ';echo $C$B$A; echo $(C='встроенная ';echo $C$B$A))
командная оболочка встроенная командная оболочка встроенная встроенная командная оболочка

Обратные кавычки

Однократное встраивание командной оболочки может оказаться полезным в том случае, если необходимо избежать изменения текущей директории. В примере ниже для встраивания командной оболочки используются обратные кавычки вместо рассмотренного ранее символа доллара со скобками.
[paul@RHELv4u3 ~]$ echo `cd /etc; ls -d * | grep pass`
passwd passwd- passwd.OLD
[paul@RHELv4u3 ~]$

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

Обратные кавычки или одинарные кавычки

Размещение встраиваемых команд межу обратными кавычками вместо круглых скобок со знаком доллара позволяет отказаться от использования одного дополнительного символа. Однако, следует быть очень осторожным, так как обратные кавычки часто путают с одинарными кавычками. В техническом плане различия между кавычками ' и ` являются значительными.
[paul@RHELv4u3 gen]$ echo `var1=5;echo $var1`
5
[paul@RHELv4u3 gen]$ echo 'var1=5;echo $var1'
var1=5;echo $var1
[paul@RHELv4u3 gen]$

Параметры командной оболочки

И команда set, и команда unset являются встроенными командами командной оболочки. Они могут использоваться для установки значений параметров самой командной оболочки bash. Проясним это утверждение, рассмотрев следующий пример. По умолчанию командная оболочка будет рассматривать неустановленные переменные как переменные, не имеющие ассоциированных значений. После установки значения параметра -u командная оболочка будет рассматривать любые обращения к неустановленным переменным как ошибки. Обратитесь к странице руководства для командной оболочки bash для получения дополнительной информации.
[paul@RHEL4b ~]$ echo $var123

[paul@RHEL4b ~]$ set -u
[paul@RHEL4b ~]$ echo $var123
-bash: var123: unbound variable
[paul@RHEL4b ~]$ set +u
[paul@RHEL4b ~]$ echo $var123

[paul@RHEL4b ~]$
Для вывода списка всех параметров вашей командной оболочки с установленными значениями следует использовать команду echo $-. Параметр noclobber (или -C) будет описан позднее в рамках данной книги (в главе, посвященной перенаправлению потоков ввода/вывода).
[paul@RHEL4b ~]$ echo $-
himBH
[paul@RHEL4b ~]$ set -C ; set -u
[paul@RHEL4b ~]$ echo $-
himuBCH
[paul@RHEL4b ~]$ set +C ; set +u
[paul@RHEL4b ~]$ echo $-
himBH
[paul@RHEL4b ~]$

При исполнении команды set без параметров вашему вниманию будет представлен список всех параметров без осуществления каких-либо изменений в том случае, если командная оболочка работает в режиме posix. Вы можете перевести командную оболочку в режим posix, выполнив команду set -o posix.

Практическое задание: встраивание командных оболочек

1. Найдите список параметров командной оболочки на странице руководства для командной оболочки bash. Каковы различия между командами set -u и set -o nounset?

2. Активируйте параметр nounset вашей командной оболочки. Проверьте, выводится ли сообщение об ошибке при использовании несуществующих переменных.

3. Деактивируйте параметр nounset.

4. Выполните команды cd /var и ls в рамках встроенной командной оболочки.

Команда echo необходима исключительно для демонстрации вывода команды ls. Исключение этой команды приведет к тому, что командная оболочка попытается использовать имя первого файла в качестве команды для исполнения.

5. Создайте переменную embvar в рамках встроенной командной оболочки и выведите ее значение. Существует ли данная переменная в рамках вашей текущей командной оболочки.

6. Дайте пояснения относительно назначения команды "set -x". Может ли эта команда оказаться полезной?

7 (необязательное задание). Отредактируйте приведенную ниже команду, добавив ровно четыре символа для того, чтобы в результате ее исполнения выводилась строка "НачалоСерединаКонец".
[paul@RHEL4b ~]$ echo  Начало; echo  Середина; echo  Конец

8. Выведите подробный список бинарных файлов (с помощью команды ls -l) с реализацией команды passwd, воспользовавшись командой which в рамках встроенной командной оболочки.

Корректная процедура выполнения практического задания: встраивание командных оболочек

1. Найдите список параметров командной оболочки на странице руководства для командной оболочки bash. Каковы различия между командами set -u и set -o nounset?

Прочитайте страницу руководства для командной оболочки bash (man bash), найдите описание параметра nounset - приведенные команды идентичны.

2. Активируйте параметр nounset вашей командной оболочки. Проверьте, выводится ли сообщение об ошибке при использовании несуществующих переменных.

set -u
или
set -o nounset

3. Деактивируйте параметр nounset.

set +u
или
set +o nounset

4. Выполните команды cd /var и ls в рамках встроенной командной оболочки.

Команда echo необходима исключительно для демонстрации вывода команды ls. Исключение этой команды приведет к тому, что командная оболочка попытается использовать имя первого файла в качестве команды для исполнения.

echo $(cd /var ; ls)

5. Создайте переменную embvar в рамках встроенной командной оболочки и выведите ее значение. Существует ли данная переменная в рамках вашей текущей командной оболочки.

echo $(embvar=emb;echo $embvar) ; echo $embvar #исполнение последней команды echo завершится неудачей

Переменной $embvar не существует в рамках вашей текущей командной оболочки.

6. Дайте пояснения относительно назначения команды "set -x". Может ли эта команда оказаться полезной?

Она активирует режим вывода информации о раскрытии команд командной оболочкой, полезный в случае необходимости диагностики вашей команды.

7 (необязательное задание). Отредактируйте приведенную ниже команду, добавив ровно четыре символа для того, чтобы в результате ее исполнения выводилась строка "НачалоСерединаКонец".
[paul@RHEL4b ~]$ echo  Начало; echo  Середина; echo  Конец
echo -n Начало; echo -n Середина; echo Конец

8. Выведите подробный список бинарных файлов (с помощью команды ls -l) с реализацией команды passwd, воспользовавшись командой which в рамках встроенной командной оболочки.

ls -l $(which passwd)


Предыдущий раздел: Оглавление Следующий раздел:
Глава 12. Переменные командной оболочки   Глава 14. История команд командной оболочки