Библиотека сайта rus-linux.net
Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой
Оригинал: Linux FundamentalsАвтор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 13 декабря 2014 г.
Глава 13. Встраивание и параметры командных оболочек
В данной главе приводится краткий обзор методов использования дочерних
и встраиваемых командных оболочек
, а также описываются некоторые параметры командных оболочек
.
Встраивание командных оболочек
[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. История команд командной оболочки |