Читаем UNIX — универсальная среда программирования полностью

PATH=/bin:/usr/bin

for i # for each argument

do

 echo -n "$i? " /dev/tty

 read response

 case $response in

 y*) echo $i ;;

 q*) break

 esac

done /dev/tty

<p>3.8.43 <code>pick.c</code></p>

/* 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] = '\0'; /* drop newline */

   pick(buf);

  }

 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("%s\n", s);

}

#include "ttyin2.c"

#include "efopen.c"

<p>3.8.44 <code>prpages</code></p>

# prpages: compute number of pages that pr will print

wc $* |

awk '!/ total$/ { n += int(($1+55) / 56) }

 END { print n }'

<p>3.8.45 <code>put</code></p>

# put: install file into history

PATH=/bin:/usr/bin

case $# in

1) HIST=$1.H ;;

*) echo 'Usage: put file' 12; exit 1 ;;

esac

if test ! -r $1

then

 echo "put: can't open $1" 12

 exit 1

fi

trap 'rm -f /tmp/put.[ab]$$; exit 1 12 15

echo -n 'Summary: '

read Summary

if get -o /tmp/put.a$$ $1 # previous version

then # merge pieces

 cp $1 /tmp/put.b$$ # current version

 echo `getname` `date` $Summary" /tmp/put.b$$

 diff -e $1 /tmp/put.a$$ /tmp/put.b$$ # latest diffs

 sed -n '/^@@@/,$р' $HIST /tmp/put.b$$ # old diffs

 overwrite $HIST cat /tmp/put.b$$ # put it back

else # make a new one

 echo "put: creating $HIST"

 cp $1 $HIST

 echo "@@@ `getname` `date` $Summary" $HIST

fi

rm -f /tmp/put.[ab]$$

<p>3.8.46 <code>readslow.c</code></p>

/* readslow: keep reading, waiting for more */

#define SIZE 512 /* arbitrary */

main {

 char buf[SIZE];

 int n;

 for (;;) {

  while ((n = read(0, buf, sizeof buf)) 0)

   write(1, buf, n);

  sleep(10);

 }

}

<p>3.8.47 <code>replace</code></p>

# replace: replace str1 in files with str2, in place

PATH=/bin:/usr/bin

case $# in

0|1|2) echo 'Usage: replace str1 str2 files' 12; exit 1

esac

left="$1"; right="$2"; shift; shift

for i

do

 overwrite $i sed "s@$left@$right@g" $i

done

<p>3.8.48 <code>signaltest.c</code></p>

#include stdio.h

#include signal.h

#include errno.h

extern int errno;

main {

 int с, n;

 char buf[100];

 int onintr;

 signal(SIGINT, onintr);

 for (;;) {

  n = read(0, buf, 100);

  if (n 0)

   printf(buf);

  else {

   if (errno == EINTR) {

    errno = 0;

    printf("interrupt side %d\n", n);

   } else {

    printf("true end of file %d\n", n);

   }

  }

 }

}

onintr {

 signal(SIGINT, onintr);

 printf("interrupt\n");

}

<p>3.8.49 <code>spname.c</code></p>

/* spname: return correctly spelled filename */

/*

 * spname(oldname, newname) char *oldname, *newname;

 * returns -1 if no reasonable match to oldname,

 * 0 if exact match,

 * 1 if corrected.

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT