Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Linux/*NIX и аргументы программы

#linux #bash #консоль #freebsd


Интересует вопрос, каким образом работают аргументы программы на разных ОС (Debian/Linux,
FreeBSD, Solaris, etc).

Для примера, возьмём стандартную программу  ls, и запустим её с аргументами -a -l.
Получим вывод. Однако, запустив ls -la, ls -al, ls -l -a - мы получим тот же вывод.
Хотелось бы узнать - данное поведение как-то контролируется разработчиками? Например,
я напишу программу, которая будет работать со следующими аргументами: -R -t -dT, как
юзер сможет запустить программу, как показано на примере ls? Это 'регулируется' автором
тулзы?
    


Ответы

Ответ 1



Это 'регулируется' автором тулзы? И да и нет. Программист сознательно должен предусмотреть это в своей программе, но для этого есть стандартная библиотечная функция — getopt() и встроенная команда оболочки getopts. Обе они стандартизированы POSIX. Интерфейсы к getopt есть практически во всех языках. Например, я напишу программу, которая будет работать со следующими аргументами: -R -t -dT, Подразумевая, что это -d и -T — это два разных ключа, на Си типовой пример обработки будет выглядеть примерно так: #include #include #include void usage(const char* name) { printf(stderr, "Usage: %s" -[RtdT] [-f ], name); } int main (int argc, char **argv){ bool recursive=0; bool show_directory=0 bool super_time=0; char *file; int c; while ((c = getopt (argc, argv, "RtdTf:")) != -1) { switch (c) { case 'R': recursive = 1; break; case 't': process_time = 1; break; case 'd': show_directorye = 1; break; case 'T': process_time = 0; break; case 'f': file = optarg break; case 'h': usage(argv[0]); return EXIT_SUCCESS; case '?': return EXIT_FAILURE; default: assert(0); } } // do stuff return EXIT_SUCCESS; } glibc также предоставляет функцию getopt_long (), которая поддерживает парсинг длинных аргументов вида --some-option и --some-option-with-arg=val, но это только расширение GNU. Для примера, возьмём стандартную программу ls, и запустим её с аргументами -a -l. Получим вывод. Такое поведение большинства утилит, кстати также стандартизовано POSIX.

Комментариев нет:

Отправить комментарий