Аргументы команд
#
Васильев Андрей Михайлович, 2024
Версии презентации
Структура команд Bash
#
После ввода команды в эмулятора терминала и нажатия клавиши Enter строка
передаётся в командный интерпретатор
Общая структура простого запроса интерпретатору
команда --аргумент1 аргумент2 аргумент3
Интерпретатор разбивает пришедшую строку на слова по непечатным символам
Команда определяет действие, которое вы хотите выполнить, а аргументы уточняют
поведение. Точное воздействие аргументов зависит от разработчиков конкретной
команды, один и тот же аргумент по названию может по-разному интерпретироваться
- Команда
cd
меняет рабочий каталог, её необязательный аргумент говорит куда
надо его изменить
- Команда
touch
создаёт файлы, аргументы указывают какие файлы надо создать и
в каком состоянии
Аргументы, параметры и ключи
#
- На первом месте в выражении, которое передаётся интерпретатору, находится
команда для исполнения
- Все остальные элементы называются аргументами или параметрами
В рамках языка Си приложение получает данные через аргументы функции main
:
int main(int argc, char* argv[])
- Переменная
argc
содержит количество аргументов приложения
- Переменная
argv
содержит список ссылок на строки
- Разработчик может обработать данные строки по своему желанию
Компиляция Си-приложений
#
Для компиляции Си-приложений необходим компилятор языка cc
:
В рамках GNU/Linux самым распространённым компилятором является компилятор GNU C Compiler, gcc
Реализация обработки аргументов
#
Разработчики стремятся снизить свою задачу, а также предоставить пользователям
знакомый интерфейс для работы, поэтому используют «стандартные» библиотеки
Для языка Си в GNU/Linux доступны следующие библиотеки для обработки аргументов
приложения:
-
getopt
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
-
Argp
#include <argp.h>
error_t argp_parse (const struct argp *argp, int argc, char **argv,
unsigned flags, int *arg_index, void *input)
Другие языки программирования предлагают свои библиотеки, чьё поведение схоже с
поведением данных двух библиотек
Категории аргументов
#
- Аргументы делятся на 2 группы: позиционные аргументы и ключи
- Ключи обычно не являются обязательными для указания
- Ключи модифицируют поведение приложения
- Смысл ключа зависит от его названия и его значения
- Смысл позиционного аргумента зависит от его места и значения
- Позиционные аргументы часто являются обязательными, например указывают путь
к файлу с данными для обработки
- Разработчик может использовать каждый из этих элементов на своё усмотрение
- Порядок аргументов зачастую важен, следует уделять этому внимание
- Обычно пользователи сначала указывают ключи, за которыми идут позиционные
аргументы
Команду в Bash можно рассмотреть как вызов функции: на первом месте находится её
название, а далее перечислены аргументы
Короткие ключи
#
Короткий, однобуквенный ключ: -l
, -a
- Состоит из одного символа
- Перед символом ставится один дефис
- Обычно служит для включения или выключения одного аспекта поведения приложения
- Короткие ключи зачастую можно комбинировать:
ls -l -a
, ls -al
Ключи могут:
- Иметь логическое значение: указан / не указан
- Для приложения
ls
если указан флаг -a
, то надо выводить все файлы
- Зачастую ключи несут именно логическое значение
- Может иметь значение. Рассмотрим команду
cal -c 2 2020
- Ключ
-c
, количество колонок, принимает в качестве аргумента число 2
- Аргумент
2020
— позиционный, указывает год, для которого надо показать календарь
Длинные ключи
#
Длинный ключ: --size
, --width=100
, --months 5
- Состоит из одного слова
- Перед словом стоит двойной дефис
- Может служить переключателем, как и короткий ключ
- Может принимать значение
- Для указания значения такому ключу необходимо его передать с помощью символа
=
или указать его после пробела
- Обычно человек может воспринять без чтения документации
Некоторые ключи имеют как короткую, так и длинную форму
- Короткие ключи позволяют экономить время на набор
- Значение длинных ключей зачастую легче понять при чтении
- Короткие ключи можно объединять друг с другом в отличие от длинных