Π§Π°ΡΡΠΎ 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(), ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ°ΠΌΡΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π·Π°ΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π³ΠΎ Π»ΡΠ±ΡΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΌ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ΠΌ.