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

How Execute Commands From Within Shell Script



В bash выполнение команд из сценария оболочки поначалу может быть немного пугающим и может потребовать решительного шага. В конце концов, команды, выполняемые в сценарии bash, не являются интерактивными. Здесь мы заложим основу для выполнения команд из сценария оболочки, ответив на следующие вопросы о командах: Откуда они берутся? Кто они такие? Как мы используем их в сценарии?

Откуда берутся команды?

Команды в bash относятся к любой из следующих категорий:







Сам Bash (см. Встроенные функции)

Bash поставляется со своим собственным набором команд, позволяющих получить доступ к его встроенным функциям, таким как объявление массивов, чтение строк из файла и другие функции, встроенные в bash. Мы называем команды этой категории встроенными командами bash или для краткости встроенными командами.



Исполняемые файлы в вашей среде (см. Внешние команды)

По умолчанию bash по умолчанию наследует определенные переменные. Это наблюдается в случае переменной PATH, включая расположение исполняемых файлов, на которые в bash ссылаются как на внешние команды. То есть, если завиток команда находится на вашем пути, она может быть выполнена из сценария bash так же, как в интерактивном режиме. Мы называем команды этой категории внешними командами или, для краткости, командами.



Пользовательская функция (см. Функции)

Перед выполнением внешних команд и встроенных функций bash проверяет, определена ли функция. Если это так, функция выполняется как команда. Если этого не происходит, то порядок приоритета команд понижается. Чтобы выполнить функцию, определенную вне сценария, они должны быть объявлены с атрибутом -x; в противном случае они могут быть включены с помощью. Команда. Мы называем команды этой категории пользовательскими функциями или для краткости функциями.





Что такое команды

Команда - это любое слово, которое следует рассматривать как единую точку входа в программу в среде оболочки. В случае выполнения команды, сама команда и необязательные аргументы передаются как позиционные параметры, $ {0}, $ {1}, $ {2},… Нулевой позиционный параметр ($ {0}) обозначает сама команда и не изменяется в контексте. То есть, в отличие от позиционных параметров в функциях, $ {1}, $ {2},… которые могут меняться в зависимости от контекста, $ {0} не изменяется между вызовами функций.

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



Вот список типов команд, которые нужно знать.

Встроенные команды

Это первоклассные граждане вселенной bash, включая такие символы, как ‘.’ ‘:’ ‘[‘ ‘]’ И зарезервированные слова, такие как declare в bash. Вы рассчитываете, что эти команды, содержащиеся в списке встроенных команд bash, будут доступны для использования в вашем сценарии bash.

В зависимости от обозначения и номера версии вашего интерпретатора bash некоторые команды могут быть недоступны.

Внешние команды

Внешние команды - это исполняемые файлы, доступные вне сценария bash, например curl. В отличие от функций, внешние команды не хранятся как переменные.

Чем ниже приоритет типа команды, тем позже команда может быть интерпретирована. Внешние команды имеют самый низкий приоритет в bash. То есть перед запуском внешней команды интерпретатор bash будет искать функции, затем встроенные функции и, наконец, пытаться увидеть, существует ли команда извне. В противном случае вы должны увидеть следующую ошибку.

bash: неизвестная-команда:командане найден

В сценарии bash функции могут переопределять поведение внешних команд, если они имеют одно и то же имя, как мы видели ранее в примерах curl bash. Ниже приводится пример настраиваемой внешней команды, использующей функцию.

завиток() {
команда $ {FUNCNAME}...
}

Это работает, потому что функции имеют более высокий приоритет, чем внешние команды и даже встроенные функции bash. Ограничение - это допустимые символы в имени функции.

Обратите внимание, что приведенный выше пример может быть выполнен с использованием псевдонима следующим образом.

псевдоним завитокзнак равно
{
завить ...
}
'

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

Функции

Правило функций в bash. Прежде чем рассматривать встроенные и внешние команды, bash проверяет, определена ли функция именем функции-кандидатом, первым словом в строке или после; символ, обозначающий конец командной строки. Единственное исключение - переменные bash, написанные заглавными буквами, например $ {FUNCNAME}.

псевдоним() { FUNCNAME= asdf;выбросил $ {@ ,,};}
псевдоним завитокзнак равно'ТЕСТОВЫЙ CURL НИКНЕЙМЫ' #?

Простые команды

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

Как выполнять команды из сценария bash

Теперь, когда мы знаем, какие типы команд доступны, мы можем подробнее рассказать о том, как их использовать в ваших сценариях. Во-первых, нам нужно знать, как работает приоритет команд в bash.

Вот несколько способов управления приоритетом в сценарии bash.

Пусть решит Баш

имя_команды

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

Выполнить внешнюю команду

командаимя_команды

Предположим, что существует внешняя команда command_name, доступная в интерактивном режиме, и вы хотите использовать ее в сценарии bash. Мы можем явно указать bash, что command_name является внешней командой, используя встроенную команду.

Примеры внешних команд

Примеры внешних команд, предполагающие, что установлены:

файл
идти
фиглет
Пример: получить тип файла и информацию
{ # получить тип файла и информацию
файл $ {infile} # (1,2)
}
# (1) команда, файл
# (2) infile = {Путь к файлу}
Пример: измененная сцена и новые файлы в git
{ # сценические файлы в git
git добавить.# (1)
}
# (1) команда, git
Пример: создание ascii-арта с помощью figlet
{ # создать ascii art
фиглет$ {сообщение} # (1,2)
}
# (1) команда, фиглет
# (2) message = {Сообщение для отображения как ascii art}

Выполнить встроенную команду

встроенныйимя_команды

Предположим, что command_name - это одна из команд, определенных как встроенная в bash. Чтобы сообщить bash, что мы хотим запустить command_name как встроенную, мы используем встроенную встроенную команду.

Примеры встроенных команд
Пример: сколько встроенных функций?
встроенный{,}{,,}{,,,} # сколько встроенных?
Пример: Призрачное объявление
{
объявлять() { выбросилой!;}
объявлять–Xfобъявлять #?
}

Заключение

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