Linux разбор командной строки

Содержание
  1. Самые полезные приёмы работы в командной строке Linux
  2. Вывод результатов работы команд в виде таблицы
  3. Многократный повтор команды до её успешного завершения
  4. Сортировка процессов по используемой памяти
  5. Сортировка процессов по использованию ресурсов CPU
  6. Одновременный просмотр нескольких лог-файлов
  7. Возврат к предыдущей директории
  8. Мониторинг с регулярными интервалами
  9. Продолжение выполнения программы после окончания сессии
  10. Автоматический ответ yes или no
  11. Создание файла заданного размера
  12. Выполнение последней команды с root-привилегиями
  13. Создание протокола терминальной сессии
  14. Замена пробелов на знаки табуляции
  15. Замена строчных букв на прописные
  16. Автоматическое формирование списка аргументов для команд: xargs
  17. Итоги
  18. Разбор опций командной строки в UNIX-подобных системах
  19. Введение
  20. POSIX
  21. Длинные опции
  22. Откуда берутся параметры в программе
  23. Разбор опций
  24. getopt
  25. пример программы с использованием getopt()
  26. getopt_long()
  27. Пример программы с использованием getopt_long()
  28. Заключение

Самые полезные приёмы работы в командной строке Linux

Каждый, кто пользуется командной строкой Linux, встречался со списками полезных советов. Каждый знает, что повседневные дела вполне можно выполнять эффективнее, да только вот одно лишь это знание, не подкреплённое практикой, никому не приносит пользы.

Как выглядят типичные трудовые будни системного администратора, который сидит на Linux? Если абстрагироваться от всего, кроме набираемых на клавиатуре команд, то окажется, что команды эти постоянно повторяются. Всё выходит на уровень автоматизма. И, если даже в работе есть что улучшать, привычка противится новому. Как результат, немало времени уходит на то, чтобы делать так, как привычнее, а не так, как быстрее, и, после небольшого периода привыкания – удобнее. Помнить об этом, сознательно вводить в собственную практику новые полезные мелочи – значит профессионально расти и развиваться, значит – экономить время, которое можно много на что потратить.

Вывод результатов работы команд в виде таблицы

Иногда вывод результатов работы команд выглядит как мешанина из беспорядочных строк. Найти то, что надо, в таких данных можно, но работать с ними неудобно. Например – что-то подобное можно получить в ответ на команду mount . Хорошо бы то же самое вывести в виде таблицы. И это не только возможно, но ещё и очень просто:


Результаты работы команды mount, оформленные в виде таблицы

По умолчанию команда формирует табличное представление, ориентируясь на пробелы между словами. А что, если в качестве разделителей используются другие символы, вроде двоеточий? Например – в выводе cat /etc/passwd ?

Упорядочить можно и такие данные – достаточно указать символ-разделитель с параметром –s . Например, ниже приведена команда для символа «:».


Отформатированный вывод /etc/passwd

Многократный повтор команды до её успешного завершения

Если вы погуглите на эту тему, то обнаружите, что многие задают вопрос о том, как повторять команду до тех пор, пока она не будет успешно выполнена. Например, такое может быть полезным при пинге сервера до тех пор, пока он не откликнется, при проверке выгрузки файлов, или при опросе некоего URL до тех пор, пока он не окажется доступен.

Решить подобную задачу поможет цикл while true . Выглядит всё это так:


Команда будет повторяться до её успешного завершения

В этом примере конструкция >/dev/null 2>&1 перенаправляет вывод программы в /dev/null , включая и Standard Error, и Standard Out.

Вероятнее всего, это – один из самых полезных приёмов работы с командной строкой Linux.

Сортировка процессов по используемой памяти


Отсортированный список процессов

Сортировка процессов по использованию ресурсов CPU

Сортировка процессов по использованию CPU делается так:


Отсортированный список процессов

Для того, чтобы вывести сведения об архитектуре, используйте команду getconf LONG_BIT .

Одновременный просмотр нескольких лог-файлов

Для просмотра лог-файлов вполне подходит команда tail , но иногда может понадобиться одновременная работа с несколькими подобными файлами. Для решения этой задачи подойдёт консольный инструмент multitail , который поддерживает выделение текста, фильтрацию и многие другие полезные возможности.

Читайте также:  D link n150 mac os


Работа с multitail

Установить эту утилиту, если вы её у себя не найдёте, можно командой apt-get install multitail .

Возврат к предыдущей директории

Для того, чтобы вернуться к предыдущей директории, просто наберите cd –.

Мониторинг с регулярными интервалами

Использование утилиты watch (например, watch df –h ) поможет организовать наблюдение за выводом любой команды. Например, можно наблюдать за объёмом свободного пространства, и за тем, как он меняется.

Пожалуй, вы сами сможете найти подходящие сценарии для использования этой команды.

Продолжение выполнения программы после окончания сессии

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

Для того, чтобы этого добиться, можно воспользоваться командой nohup , название которой расшифровывается как «no hang-up». Выглядит это так:

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


Команда nohup

В примере, показанном на рисунке выше, в текущей директории будет создан файл nohup.out , содержащий вывод команды:


Файл nohup.out

Полезная штука, согласны?

Автоматический ответ yes или no

Предположим, вы хотите автоматизировать процесс, который требует от пользователя постоянно отвечать yes . Сделать это можно, используя команду yes :

Возможно, вместо этого вы решите автоматизировать отрицательные ответы. Тут поможет такая конструкция:


Автоматизация ответа YES

Создание файла заданного размера

Создавать файлы заданного размера можно, используя команду dd :

Вышеприведённая команда создаст файл размером 10 Мб, заполненный нулями.


Создание файла заданного размера

Выполнение последней команды с root-привилегиями

Иногда можно забыть ввести sudo перед командой, которой нужны root-привилегии. Вводить всё заново нет нужды – достаточно воспользоваться такой командой:


Выполнение последней команды с root-привилегиями

Создание протокола терминальной сессии

Для того, чтобы записать в файл всё, что было выведено в окне терминала, можно воспользоваться командой script .

После выхода из сессии протокол будет записан в файл typescript .

Замена пробелов на знаки табуляции

Вот команда, которая позволяет заменить пробелы на знаки табуляции:

На самом деле, она универсальна и умеет работать с любыми символами.

Замена строчных букв на прописные

А вот – пример вышеописанной команды для замены строчных букв в файле с текстом на прописные:


Замена строчных букв в файле на прописные

Автоматическое формирование списка аргументов для команд: xargs

Утилита xargs , пожалуй, достойна звания одной из самых полезных возможностей командной строки Linux. Её можно использовать для передачи вывода некоей команды в качестве аргумента для другой. Например, вот как можно выполнить поиск .png-файлов и сжать их, или сделать с ними что-нибудь ещё:

Или, возможно, у вас имеется файл со списком URL, и вы хотите загрузить ресурсы по этим адресам, или ещё как-то их обработать:

Тут надо учитывать, что вывод первой команды передаётся в качестве аргумента в конце команды xargs . Если при конструировании второй команды надо явно указать место, куда должны попасть выходные данные первой, достаточно воспользоваться парой фигурных скобок, <> и параметром –i для замены аргумента в нужном месте:


Команда xargs

Итоги

Полезности для командной строки Linux – тема невероятно обширная. Поэтому любой список, подобный нашему, можно пополнять очень и очень долго. Например, много неожиданного скрыто в командах awk и sed . Пожалуй, главное – чтобы такие вот списки шли в дело.

Читайте также:  Notepad windows 10 x64

А какими интересными приёмами работы в командной строке пользуетесь вы?

Источник

Разбор опций командной строки в UNIX-подобных системах

Введение

POSIX

Стандарт POSIX описывает ожидаемое поведение программ в UNIX-подобных системах. При написание программы никто вас не заставит строго следовать стандарту, однако, это является хорошей идеей, так как это облегчит жизнь вашим пользователям. Вот основные правила касающиеся аргументов команды:

  • в имени программы должно быть не менее 2 и не более 9 символов;
  • имена программ должны быть написаны только строчными символами и цифрами;
  • имя опции должно быть простым буквенно-цифровым символом. Опции с множеством цифр запрещены;
  • все опции должны начинаться с символа «-«;
  • для опций без аргументов должны быть реализована возможность объединения опций (например foo -a -b -c и foo -abc);
  • аргумент опции должен отделятся от нее пробелом;
  • аргумент опции не может быть необязательным;
  • если опции требуется множество значений аргумента, они должны передаваться в виде строки, разделенные запятыми или разделителем;
  • опции должны идти перед операндами;
  • аргумент «—» указывает на окончание всех опций;
  • порядок опций не должен играть роли, кроме случаев когда опции взаимоисключающие, тогда побеждает последняя;
  • порядок аргументов может иметь значение;
  • программы читающие или записывающие именованные файлы, должны трактовать единственный аргумент «-» как стандартный ввод или стандартный вывод соответственно.

Длинные опции

В GNU программах также используются длинные опции, поведение которых не описано в POSIX, длинные опции начинаются с «—» Для этих опций в GNU также реализованы следующие соглашения:

  • каждая короткая опция должна иметь свой вариант длинной опции;
  • длинную опцию можно сократить до кратчайшей строки, обеспечивающей ее уникальность;
  • Аргументы длинной опции отделяются либо разделителем, либо знаком «=».

Откуда берутся параметры в программе

как известно функция main() в С определяется так:
int main(int argc, char *argv[])
Здесь присутствует два параметра: argc определяет количество аргументов в командной строке, а argv хранит массив указателей на эти аргументы.
Следует отметить, что argv[0] — всегда имя команды, а argv[argc] == NULL, эти два факта могут оказаться полезными при разработке.

Разбор опций

В 80-х годах группа поддержки Unix заметила, что каждая программа Unix использует собственные методы разбора опций. Что послужило толчком к разработке функции getopt(), чтобы упростить написание кода, придерживающегося стандартных соглашений.
Функция GNU getopt_long(), является совместимой с getopt(), а также упрощает разбор длинных опций.

getopt

Объявление:
#include
int getopt(int argc, char *argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

Аргументы argc и argv передаются непосредственно от функции main(), а optstring является строкой символов опций. Если за какой либо буквой в строке следует двоеточие, значит эта опция принимает аргумент.
Для использования getopt() ее вызывают повторно в цикле, до тех пор, пока она не вернет -1. Каждый раз обнаружив действительный символ опции, функция возвращает этот символ. Если опция принимает аргумент, то указатель на него помещается в переменную optarg.
переменная optind хранит текущий индекс в argv. Когда переменная opterr не равна нулю (по умолчанию 0), getopt() сама выводит сообщения в случае недействительной опции или отсутствия аргумента. Если же opterr равен нулю, то в случае возникновения ошибки getopt() возвращает «?» или «:» в зависимости от того найдена недействительная опция или пропущен обязательный аргумент опции, в переменной optopt будет находится обнаруженный недействительный символ.
Следует заметить, что стандартная функция getopt() останавливается сразу как только найдет первый аргумент начинающийся не с символа «-«, GNU вариант функции просматривает в поисках опций, всю командную строку. Поведение GNU функции можно изменить (но это выходит за рамки статьи).

Читайте также:  Windows 10 dolby ошибка

пример программы с использованием getopt()

  1. #include
  2. #include
  3. #include
  4. int main( int argc, char **argv) <
  5. if (argc == 1) < // если запускаем без аргументов, выводим справку
  6. printf( «getopt test\n» );
  7. printf( «usage:\n» );
  8. printf( » opts -a n -b m -o s\n» );
  9. printf( «example:\n» );
  10. printf( » $ opts -a 323 -b 23 -o ‘-‘\n» );
  11. printf( » 323 — 23 = 300\n» );
  12. return 0;
  13. >
  14. char *opts = «a:b:o:» ; // доступные опции, каждая принимает аргумент
  15. int a, b; // тут храним числа
  16. char op; // а тут оператор
  17. int opt; // каждая следующая опция попадает сюда
  18. while ((opt = getopt(argc, argv, opts)) != -1) < // вызываем getopt пока она не вернет -1
  19. switch (opt) <
  20. case ‘a’ : // если опция -a, преобразуем строку с аргументом в число
  21. a = atoi(optarg);
  22. break ;
  23. case ‘b’ : // тоже для -b
  24. b = atoi(optarg);
  25. break ;
  26. case ‘o’ : // в op сохраняем оператор
  27. op = optarg[0];
  28. break ;
  29. >
  30. >
  31. switch (op) <
  32. case ‘+’ : // если опаратор + складываем, и т.д.
  33. printf( «%d + %d = %d\n» , a, b, a + b);
  34. break ;
  35. case ‘-‘ :
  36. printf( «%d — %d = %d\n» , a, b, a — b);
  37. break ;
  38. case ‘*’ :
  39. printf( «%d * %d = %d\n» , a, b, a * b);
  40. break ;
  41. case ‘/’ :
  42. printf( «%d / %d = %d\n» , a, b, a / b);
  43. break ;
  44. >
  45. return 0;
  46. >

* This source code was highlighted with Source Code Highlighter .

getopt_long()

int getopt_long(int argc, char *argv[], const char *optstring, const struct option *longopts, int *longindex);

первые три аргумента те же, что и в getopt(), longopts является указателем на массив длинных опций, longindex указывает на переменную, в которую помещается индекс обнаруженной длинной опции в longopts, если в это нет необходимости может быть NULL.

Структура option определена следующим образом:
struct option
<
const char *name;
int has_arg;
int *flag;
int val;
>

name — имя опции без предшествующих черточек;
has_arg — как понятно из названия, переменная описывает имеет ли длинная опция аргумент, может принимать три значения:

  • 0 — не принимает аргумент;
  • 1 — обязательный аргумент;
  • 2 — необязательный аргумент.

flag — если этот указатель равен NULL, то getopt_long() возвращает значение поля val, иначе она возвращает 0, а переменная на которую указывает flag заполняется значением val;
val — обычно содержит некоторую символьную константу, если длинная опция соответствует короткой, то эта константа должна быть такой же как и та что появляется в аргументе optstring.
Важно заметить, что последний элемент массива longopts, должен быть заполнен нулями.

Пример программы с использованием getopt_long()

  1. #include
  2. #include
  3. #include
  4. #include
  5. void usage( char *name)
  6. <
  7. printf( «usage: %s\n \ \t-h this message\n \ \t-c [config file]\n \ \t—help this message\n \ \t—config=config_file\n», name);
  8. return ;
  9. >
  10. int main ( int argc, char *argv[])
  11. <
  12. int c;
  13. while (1) <
  14. static struct option long_opt[] = <
  15. < «help» , 0, 0, 'h' >,
  16. < «config» , 1, 0, 'c' >,
  17. >;
  18. int optIdx;
  19. if ((c = getopt_long(argc, argv, «c:h» , long_opt, &optIdx)) == -1)
  20. break ;
  21. switch ( c ) <
  22. case ‘h’ :
  23. usage(argv[0]);
  24. return (-1);
  25. case ‘c’ :
  26. printf( «option ‘c’ selected, filename: %s\n» , optarg);
  27. return (1);
  28. default :
  29. usage(argv[0]);
  30. return (-1);
  31. >
  32. >
  33. return (0);
  34. >

* This source code was highlighted with Source Code Highlighter .

Заключение

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

Статья подготовлена по материалам книги Арнольда Роббинса «Linux программирование в примерах» ISBN 5-9579-0059-1

Источник

Оцените статью