Иногда требуется запустить одну или несколько команд или скриптов в фоновом режиме. Это можно сделать, записав все команды или сценарии в файл сценария и выполнив его с помощью амперсанда (&) или выполнив команды или сценарии в подоболочке из текущей оболочки. Подоболочка может быть использована для выполнения нескольких команд или скриптов, заключенных в оболочку с помощью символов $() или обратных знаков (`). Способы использования подоболочек Bash показаны в данном учебном пособии.
Различные примеры подоболочек
В этой части учебного пособия показаны различные способы выполнения сценария в подоболочке.
Пример 1: Выполнение подоболочки с использованием одинарной и двойной кавычек
Создайте Bash-файл со следующим сценарием, который печатает текущую дату и время. Далее выводится переменная $strVal, заключив сценарий подшелла в одинарные и двойные кавычки.
1 2 3 4 5 6 7 8 9 | #!/bin/bash #Вывод команды `date` echo "Today is `date`" #Определите строковую переменную strVal="Bash Subshell" #Выведите переменную в подоболочке, используя одинарные кавычки echo "Вывод одинарных кавычек:" '$(echo $strVal)' #Вывод переменной в подоболочке с использованием двойных кавычек echo "Вывод двойных кавычек:" "$(echo $strVal)" |
После выполнения сценария появляется следующий вывод. Сценарий подшивки печатается как строка, если он заключен в одинарные кавычки. При заключении сценария подшивки в двойные кавычки он выполняется:
Пример 2: Поиск всех файлов определенного расширения с помощью под-оболочки
Создайте Bash-файл со следующим сценарием, который принимает на вход от пользователя расширение файла. Далее в подшивке выполняется команда "ls" для поиска всех файлов данного расширения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash echo -n "Введите имя расширения файла:" #Введите имя расширения файла, по которому будет производиться поиск read ext #Проверка введенного значения if [[ $ext == "" ]]; then #Вывести сообщение об ошибке echo "No extenion is given." else echo "Filenames with $ext extension:" #Вывести все имена файлов с заданным расширением echo "$( echo `ls *.$ext` )" fi |
После выполнения скрипта с входным параметром "txt" появляется следующий результат. Согласно полученному результату, в текущем местоположении существует три текстовых файла:
После выполнения скрипта с пустым значением появляется следующий вывод:
Пример 3: Выполнение арифметического выражения в подоболочке
Создайте Bash-файл со следующим сценарием, в котором одноименная переменная используется в основной оболочке и в подоболочке. Арифметическая операция определена в основной оболочке и в подоболочке.
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash #Определить переменную родительской оболочки number=10 #Вывести результат на основе переменной родительской оболочки ((result=$number+5)) echo "Сумма $number+5=$result" #Создать переменную под-оболочки с тем же именем, что и в родительской оболочке ( number=20 ; ((result=$number+10)); echo "Сумма $number+5=$result" ) #Вновь вывести результат на основе переменной родительской оболочки echo "Сумма $number+5=$result" |
После выполнения скрипта появляется следующий вывод. В первом и последнем выводах показан результат работы основной оболочки. Во втором выводе показан результат работы под-оболочки. Переменная основной оболочки не модифицируется переменной подоболочки:
Пример 4: Выполнение нескольких команд в подоболочке
Создайте Bash-файл со следующим сценарием, который отправляет вывод команды "echo" в команду "sed", заменяющую совпадающее строковое значение на другую строку. Результатом команды "echo" является значение "JavaScript". Таким образом, это значение сравнивается с "Java" и "JavaScript". Если совпадение найдено, то совпадающие строки заменяются строкой "Type".
1 2 3 4 5 6 7 8 | #!/bin/bash #Определить строковое значение strVal="JavaScript" #Вывести исходное строковое значение echo "String value: $strVal" #Вывести значение подшивки echo -n "Значение: " echo "$(echo $strVal | sed 's|Java|JavaScript Type|')" |
После выполнения сценария появляется следующий вывод. Судя по выводу, строка "Java" заменена строкой "Type". В результате вложенная оболочка выдает "JavaScript TypeScript":
Заключение
Одна или несколько команд или сценариев могут быть выполнены с помощью подоболочки, не затрагивая основную оболочку. В данном учебном пособии на нескольких примерах объясняются цели использования подоболочек. В приведенных примерах с помощью под-оболочки выполняются различные типы задач, такие как поиск файлов, вычисление суммы чисел, замена строк и т.д. Концепция использования подоболочек продемонстрирована наглядно, и после прочтения этого руководства начинающие пользователи Bash смогут использовать подоболочки.