Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 68

Автор Майкл ДТонсон

Часто glob() наталкиваСтся Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρƒ процСсса Π½Π΅Ρ‚ доступа, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ошибки. Π₯отя ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ссли glob() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ (GLOB_ERR), ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ унивСрсализации нСльзя ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΌ, Π³Π΄Π΅ прСдыдущая опСрация унивСрсализации ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»Π°ΡΡŒ с ошибкой. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ слоТно ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ошибки, происходящиС Π²ΠΎ врСмя выполнСния glob(), ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, glob() позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½Π½ΡƒΡŽ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая опрСдСляСтся Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ glob().

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅.

int globerr(const char * pathname, int globerrno);

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСдаСтся ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² opendir(), readdir() ΠΈΠ»ΠΈ stat(). Если функция ошибки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ большС нуля, glob() возвращаСтся с ошибкой. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС опСрация унивСрсализации продолТаСтся.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ унивСрсализации хранятся Π² структурС glob_t, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся pglob. Она Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ описанныС Π½ΠΈΠΆΠ΅ элСмСнты, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π°Π±ΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π°ΠΉΡ‚ΠΈ согласованныС ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ².

gl_pathc ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΡƒΡ‚Π΅Π²Ρ‹Ρ… ΠΈΠΌΠ΅Π½, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. gl_pathv Массив ΠΏΡƒΡ‚Π΅Π²Ρ‹Ρ… ΠΈΠΌΠ΅Π½, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ.

ПослС использования Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° glob_t Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΈΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ слСдуСт ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅Π³ΠΎ Π² globfree().

void globfree(glob_t * pglob);

БистСмный Π²Ρ‹Π·ΠΎΠ² glob() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ GLOB_NOSPACE Π² случаС Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти, GLOB_ABEND, Ссли ошибка чтСния ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, GLOB_NOMATCH, Ссли соотвСтствия Π½Π΅ Π±Ρ‹Π»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹, ΠΈΠ»ΠΈ 0, Ссли функция Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ ΡƒΠ΄Π°Ρ‡Π½ΠΎ ΠΈ нашла соотвСтствия.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ glob() Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° globit, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ мноТСство шаблонов Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², унивСрсализируСт ΠΈΡ… ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’ случаС ошибки отобраТаСтся сообщСниС, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π° опСрация унивСрсализации продолТаСтся.

 1: /* globit.с */

 2:

 3: #include <errno.h>

 4: #include <glob.h>

 5: #include <stdio.h>

 6: #include <string.h>

 7: #include <unistd.h>

 8:

 9: /* Π­Ρ‚ΠΎ функция ошибки, которая пСрСдаСтся Π² glob(). Она просто ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚

10:    сообщСниС ΠΎΠ± ошибкС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ состояниС успСха, Ρ‡Ρ‚ΠΎ позволяСт glob()

11:    ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. */

12: int errfn(const char * pathname, int theerr) {

13:  fprintf(stderr, "ошибка ΠΏΡ€ΠΈ доступС ΠΊ %s: %s\n", pathname,

14:  strerror(theerr));

15:

16:  /* ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ унивСрсализации Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ, поэтому Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 0 */

17:  return 0;

18: }

19:

20: int main(int argc, const char ** argv) {

21:  glob_t result;

22:  int i, rc, flags;

23:

24:  if (argc < 2) {

25:   printf("Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚\n") ;

26:   return 1;

27:  }

28:

29:  /* ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ flags Π² 0; ΠΏΠΎΠ·ΠΆΠ΅ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π½Π° GLOB_APPEND */

30:  flags = 0;

31:

32:  /* ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ всСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки */

33:  for (i = 1; i < argc; i++) {

34:   rc = glob(argv[i], flags, errfn, &result);

35:

36:   /* благодаря errfn, GLOB_ABEND Π½Π΅ происходит */

37:   if (rc == GLOB_NOSPACE) {

38:    fprintf(stderr, "Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти для выполнСния унивСрсализации\n");

39:    return 1;

40:   }

41:

42:   flags |= GLOB_APPEND;

43:  }

44:

45:  if (!result.gl_pathc) {

46:   fprintf(stderr, "соотвСтствий Π½Π΅Ρ‚\n");

47:   rc = 1;

48:  } else {

49:   for (i = 0; i < result.gl_pathc; i++)

50:    puts(result.gl_pathv[i]);

51:   rc = 0;

52:  }

53:

54:  /* структура glob_t Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ· ΠΏΡƒΠ»Π° malloc(),

55:     которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ освобоТдСна */

56:  globfree(&result);

57:

58:  return rc;

59: }

14.6. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ ladsh возмоТностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ унивСрсализациСй

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΡŽ ladsh, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΊ ladsh3.с Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π½ΠΎΠ²Ρ‹Ρ… возмоТности.

1. Π’строСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° cd для смСны ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².

2. Π’строСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° pwd для отобраТСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

3. Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΈΠΌΠ΅Π½.

4. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ряда Π½ΠΎΠ²Ρ‹Ρ… сообщСний, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ прСимущСствами strsignal(). Π­Ρ‚ΠΈ измСнСния ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΈΡΡŒ Π² Π³Π»Π°Π²Π΅ 12.

14.6.1. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ встроСнных ΠΊΠΎΠΌΠ°Π½Π΄ cd ΠΈ pwd

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ встроСнных ΠΊΠΎΠΌΠ°Π½Π΄ являСтся прямым ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² chdir() ΠΈ getcwd(). Код соотвСтствуСт runProgram() ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ встроСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ€Π°Π·Π΄Π΅Π» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ встроСнных ΠΊΠΎΠΌΠ°Π½Π΄ Π² ladsh3.с.

422: if (!strcmp(newJob.progs[0].argv[0], "exit")) {

423:  /* здСсь Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ */

424:  exit(0);

425: } else if (!strcmp(newJob.progs[0].argv[0], "pwd")) {

426:  len = 50;

427:  buf = malloc(len);

428:  while (!getcwd(buf, len) && errno == ERANGE) {

429:   len += 50;

430:   buf = realloc(buf, len);

431:  }

432:  printf("%s\n", buf);

433:  free(buf);

434:  return 0;

435: } else if (!strcmp(newJob.progs[0].argv[0], "cd")) {

436:  if (!new Job.progs[0].argv[1] == 1)

437:   newdir = getenv("HOME");

438:  else

439:   newdir = newJob.progs[0].argv[1];

440:  if (chdir(newdir))

441:   printf("сбой ΠΏΡ€ΠΈ смСнС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°: %s\n",

442:  strerror(errno));

443:  return 0;

444: } else if (!strcmp(newJob.progs[0].argv[0], "jobs")) {

445:  for (job = jobList->head; job; job = job->next)

446:   printf(JOB_STATUS_FORMAT, job->jobId, "ВыполняСтся",

447:    job -> text);

448:  return 0;

449: }

14.6.2. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ унивСрсализации Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΈΠΌΠ΅Π½

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΈΠΌΠ΅Π½, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ символы *, [] ΠΈ ? Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ слоТно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² примСнСния ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ. ΠŸΠ΅Ρ€Π²Π°Ρ модификация Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² построСнии ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ строки, подходящСй для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² glob(). Если символ унивСрсализации ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, принятыС Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ), Ρ‚ΠΎΠ³Π΄Π° символу унивСрсализации ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ \ с Ρ†Π΅Π»ΡŒΡŽ прСдотвращСния Π΅Π³ΠΎ разворачивания Π² glob(). Π­Ρ‚ΠΎΡ‚ процСсс рСализуСтся Π»Π΅Π³ΠΊΠΎ, хотя с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ взгляда ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТным.

Π”Π²Π΅ части синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ Π² parseCommand() Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ слСгка ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ " ΠΈ ' ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π»ΠΈΠΆΠ΅ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ Ρ†ΠΈΠΊΠ»Π°, Ρ‡Ρ‚ΠΎ обСспСчиваСт Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Если Π²ΠΎ врСмя синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΌΡ‹ находимся Π² сСрСдинС строки Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… ΠΈ сталкиваСмся с символом унивСрсализации, ΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡŽΡ‰ΠΈΠΌ символом \, Ρ‡Ρ‚ΠΎ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

189: } else if (quote) {

190:  if (*src == '\\') {

191:   src++;

192:   if (!*src) {

193:    fprintf(stderr,

194:     "послС \\ оТидался символ\n");

195:    freeJob(job);

196:    return 1;

197:   }

198:

199:   /* Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ "\'" Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π°Ρ‚ΡŒ \' */

200:   if (* src ! = quote) *buf++ = '\\';

201:  } else if (*src = '*' | | *src == '?' || *src == '[' ||

202:   *src == ']')

203:   *buf++ = '\\';

204:  *buf++ = *src;

205: } else if (isspace(*src)) {

Π’ ΠΊΠΎΠ΄ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ срСдний else if ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания Π² Π΅Π³ΠΎ Ρ‚Π΅Π»Π΅. ΠŸΠΎΡ…ΠΎΠΆΠΈΠΉ ΠΊΠΎΠ΄ потрСбуСтся ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символов \, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π²Π½Π΅ строк Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…. Π­Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° parseCommand(). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

329: case '\\':

330:  src++;

331:  if (!*src) {

332:   freeJob(job);

333:   fprintf(stderr, "послС \\ оТидался символ\n");

334:   return 1;

335:  }

336:  if (* src == '*' || *srс == '[' | | *src == ']'

337:   || *srс == '?')

338:   *buf++ = '\\';

339:  /* сквозная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° */

340: default:

341:  *buf++ = *src;

Для Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π½Π°ΠΊΠΎΠ² унивСрсализации Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ здСсь Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΊΠΎΠ΄.

Π­Ρ‚ΠΈ Π΄Π²Π΅ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² glob() Π±Π΅Π· поиска Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… совпадСний.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ globLastArgument(), которая унивСрсализируСт самый послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π»ΡŽΠ±Ρ‹ΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ совпадСниСм.