Книга: UNIX — универсальная среда программирования

6.5 Пример: pick

6.5 Пример: pick

Версия pick из гл. 5, несомненно, увеличивает возможности shell. Версия на Си, приведенная ниже, в чем-то отличается от рассмотренной в гл. 5. Если эта версия имеет аргументы, то они обрабатываются так же, как и ранее, но если определен единственный аргумент '-', pick обрабатывает свой стандартный входной поток.

Почему бы в отсутствие аргументов просто не читать стандартный входной поток? Рассмотрим вторую версию команды zap из разд. 5.6:

kill $SIG `pick`ps-ag | egrep "$*"` | awk '{print $1}'`

Что происходит, если шаблон egrep ни с чем не совпадает? В этом случае pick не имеет аргументов и читает свой стандартный входной поток; команда zap терпит неудачу загадочным образом. Требование явного аргумента простой способ устранить неоднозначность, и соглашение о '-' в cat и других программах показывает, как его определить.

/* pick: offer choice on each argument */
#include <stdio.h>
char *progname; /* program name for error message */
main(argc, argv)
 int argc;
 char *argv[];
{
 int i;
 char buf[BUFSIZ];
 progname = argv[0];
 if (argc == 2 && strcmp(argv[1], "-") == 0) /* pick - */
  while (fgets(buf, sizeof buf, stdin) != NULL) {
   buf[strlen(buf)-1] = ''; /* drop newline */
   pick(buf);
  }
 else
  for (i = 1; i < argc; i++)
   pick(argv[i]);
 exit(0);
}
pick(s) /* offer choice of s */
 char *s;
{
 fprintf(stderr, "%s? ", s);
 if (ttyin() == 'y')
  printf("%sn", s);
}

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

Упражнение 6.10

Если есть pick, существует ли необходимость в rm -i?

Оглавление книги


Генерация: 1.122. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз