Аргументы команд #
Васильев Андрей Михайлович, 2024
Версии презентации
Структура команд Bash #
После ввода команды в эмулятора терминала и нажатия клавиши Enter строка передаётся в командный интерпретатор
Общая структура простого запроса интерпретатору
команда --аргумент1 аргумент2 аргумент3
Интерпретатор разбивает пришедшую строку на слова по непечатным символам
Команда определяет действие, которое вы хотите выполнить, а аргументы уточняют поведение. Точное воздействие аргументов зависит от разработчиков конкретной команды, один и тот же аргумент по названию может по-разному интерпретироваться
- Команда
cd
меняет рабочий каталог, её необязательный аргумент говорит куда надо его изменить - Команда
touch
создаёт файлы, аргументы указывают какие файлы надо создать и в каком состоянии
Аргументы, параметры и ключи #
- На первом месте в выражении, которое передаётся интерпретатору, находится команда для исполнения
- Все остальные элементы называются аргументами или параметрами
В рамках языка Си приложение получает данные через аргументы функции main
:
int main(int argc, char* argv[])
- Переменная
argc
содержит количество аргументов приложения - Переменная
argv
содержит список ссылок на строки - Разработчик может обработать данные строки по своему желанию
Компиляция Си-приложений #
Для компиляции Си-приложений необходим компилятор языка cc
:
cc main.c -o app
В рамках GNU/Linux самым распространённым компилятором является компилятор GNU C Compiler, gcc
Реализация обработки аргументов #
Разработчики стремятся снизить свою задачу, а также предоставить пользователям знакомый интерфейс для работы, поэтому используют «стандартные» библиотеки
Для языка Си в GNU/Linux доступны следующие библиотеки для обработки аргументов приложения:
-
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring);
-
#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
- Состоит из одного слова
- Перед словом стоит двойной дефис
- Может служить переключателем, как и короткий ключ
- Может принимать значение
- Для указания значения такому ключу необходимо его передать с помощью символа
=
или указать его после пробела - Обычно человек может воспринять без чтения документации
Некоторые ключи имеют как короткую, так и длинную форму
- Короткие ключи позволяют экономить время на набор
- Значение длинных ключей зачастую легче понять при чтении
- Короткие ключи можно объединять друг с другом в отличие от длинных