ΠΡΠ°ΠΊ, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.2.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.2. Π€ΡΠ½ΠΊΡΠΈΡ getoptΠ ΡΡΠΎΠΌ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ getopt; Π½Π°Π·ΠΎΠ²ΠΈΡΠ΅ Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ argopt.c.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, ":if:lr")) != -1) {
switch(opt) {
case 'i':
case 'l':
case 'r':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case ':':
printf("option needs a value\n");
break;
case '?':
printf("unknown option: %c\n", optopt);
break;
}
}
for (; optind < argc; optind++)
printf("argument: %s\n", argv[optind]);
exit(0);
}
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Π²ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:
$ ./argopt -i -lr 'hi there' -f fred.Ρ -q
option: i
option: l
option: r
filename: fred.c
unknown option: q
argument: hi there
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ getopt Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²-ΠΎΠΏΡΠΈΠΉ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ getopt Π²Π΅ΡΠ½Π΅Ρ -1. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΎΠΏΡΠΈΠΉ ΠΈ ΠΏΡΠΎΠΏΡΡΠ΅Π½Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΄ΡΡΠ³Π°Ρ Π²Π΅ΡΡΠΈΡ getopt, ΡΠΎ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²ΡΠ²ΠΎΠ΄, ΡΠ»Π΅Π³ΠΊΠ° ΠΎΡΠ»ΠΈΡΠ°ΡΡΠΈΠΉΡΡ ΠΎΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ, β ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ β Π½ΠΎ ΡΠΌΡΡΠ» Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ½ΡΡΠ΅Π½.
ΠΠΎΠ³Π΄Π° Π²ΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΎΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π½ΡΡΠ΅, Π½ΠΎ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π½ΠΎΠΌΠ΅ΡΠ°, Ρ ΡΠ°Π½ΡΡΠ΅Π³ΠΎΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ optind.
getopt_long
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Linux ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π‘ ΠΏΡΠΎΠ΅ΠΊΡΠ° GNU ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²Π΅ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ getopt, Π½Π°Π·Π²Π°Π½Π½ΡΡ getopt_long, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ Π΄Π»ΠΈΠ½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π²ΠΎΠ΄ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΈΡΠ°.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.3.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.3. Π€ΡΠ½ΠΊΡΠΈΡ getopt_longΠΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ getopt_long Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π»ΠΈΠ½Π½ΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠΎΠ² ΠΎΠΏΡΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΡ :
$ ./longopt --initialize --list 'hi there' --file fred.c -q
option: i
option: l
filename: fred.c
./longopt: invalid option --q
unknown option: q
argument: hi there
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΈ Π½ΠΎΠ²ΡΠ΅ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ, ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡΠΈΠ²Π°ΡΡ. ΠΠ»ΠΈΠ½Π½ΡΠΌ ΠΎΠΏΡΠΈΡΠΌ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°ΡΡ ΡΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΡΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ, Π½ΠΎ ΠΎΠ½ΠΈ
Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΠΎΠΏΡΠΈΠΉ. ΠΠ»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π² Π²ΠΈΠ΄Π΅ --ΠΎΠΏΡΠΈΡ= Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»Π΅Π΅:
$ ./longopt --init -l --file=fred.Ρ 'hi there'
option: i
option: l
filename: fred.Ρ
argument: hi there
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° longopt.c, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½Π°Ρ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ argopt.c Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΌΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΄Π»ΠΈΠ½Π½ΡΡ ΠΎΠΏΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΡΠ²Π΅ΡΠΎΠΌ.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define _GNU_SOURCE
#include <getopt.h>
int main(int argc, char *argv[]) {
int opt;
struct option_longopts[] = {
{"initialize", 0. NULL, 'i'},
{"file" 1, NULL, 'f'},
{"list", 0, NULL, 'l'},
{0, 0, 0, 0}};
while ((opt = getopt_long(argc, argv, ":if:lr, longopts, NULL)) != -1) {
switch(opt) {
case 'i':
case 'l':
case 'r':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case ':':
printf("option needs a value\n");
break;
case '?':
printf("unknown option: %c\n", optopt);
break;
}
}
for (; optind < argc; optind++)
printf("argument: %s\n", argv[optind]);
exit(0);
}
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π€ΡΠ½ΠΊΡΠΈΡ getopt_long ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ getopt. ΠΠ΅ΡΠ²ΡΠΉ ΠΈΠ· Π½ΠΈΡ β ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΡΠΊΡΡΡ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ getopt_long ΡΠΏΠΎΡΠΎΠ± ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΡΠΎΡΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β Π°Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ optind, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ Π΄Π»ΠΈΠ½Π½ΡΡ ΠΎΠΏΡΠΈΠΉ; Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ Π΅Π΅ Π½ΠΎΠΌΠ΅Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π΄Π»ΠΈΠ½Π½ΡΡ ΠΎΠΏΡΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Π° ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ NULL Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°.
ΠΠ°ΡΡΠΈΠ² Π΄Π»ΠΈΠ½Π½ΡΡ ΠΎΠΏΡΠΈΠΉ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΠ΄Π° ΡΡΡΡΠΊΡΡΡ ΡΠΈΠΏΠ° struct option, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ. ΠΠ°ΡΡΠΈΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΡΡ ΡΡΡΡΠΊΡΡΡΠΎΠΉ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅ΠΉ Π²ΡΠ΅ Π½ΡΠ»ΠΈ.
Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ getopt.h ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ _GNU_SOURCE, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ getopt_long.
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΡΠ°Π±Π». 4.1.
Π’Π°Π±Π»ΠΈΡΠ° 4.1.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΎΠΏΡΠΈΠΈ ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ name ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ. Π‘ΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΄ΡΡ ΠΏΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠΉ Π΄ΡΡΠ³ΠΈΡ ΠΎΠΏΡΠΈΠΉ has_arg ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π»ΠΈ ΡΡΠ° ΠΎΠΏΡΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ. ΠΠ°Π΄Π°ΠΉΡΠ΅ 0 Π΄Π»Ρ ΠΎΠΏΡΠΈΠΉ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², 1 Π΄Π»Ρ ΠΎΠΏΡΠΈΠΉ, Ρ ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈ 2 Π΄Π»Ρ ΠΎΠΏΡΠΈΠΉ Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ flag ΠΠ°Π΄Π°ΠΉΡΠ΅ NULL, ΡΡΠΎΠ±Ρ getopt_long Π²Π΅ΡΠ½ΡΠ»Π° ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π² val. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ getopt_long Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0 ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ val Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ flag val ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ getopt_long Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΎ Π΄ΡΡΠ³ΠΈΡ ΠΎΠΏΡΠΈΡΡ , ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ getopt Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ GNU ΠΈ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ , ΡΠΌ. ΡΡΡΠ°Π½ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ getopt.
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
ΠΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π² Π³Π»Π°Π²Π΅ 2. ΠΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΈΡ Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΡΠ΅Π΄Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ HOME, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ°Ρ Π΅Π³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΡΡΠ°ΡΡΠ° Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π΅Π΅ ΡΠ΅Π°Π½ΡΠ°. ΠΠ°ΠΊ Π²Ρ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· ΡΡΡΠΎΠΊΠΈ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ:
$ echo $ΠOΠΠ
/home/neil
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ set Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
Π ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ UNIX ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ ΡΠ΅Π»Π΅ΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠΈΠΏ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, ΠΈΠΌΠ΅Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠ², ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ°ΡΠΎΠ²ΡΡ ΠΏΠΎΡΡΠΎΠ² ΠΈ Ρ.Π΄. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π° ΡΠ·ΡΠΊΠ΅ Π‘ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ putenv ΠΈ getenv.
#include <stdlib.h>
char *getenv(const char *name);
int putenv(const char *string);
ΠΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΡΠΎΠΊ Π²ΠΈΠ΄Π° ΠΈΠΌΡ=Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ getenv ΠΈΡΠ΅Ρ Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΡΡΠΎΠΊΡ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ ΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠΠ½Π° Π²Π΅ΡΠ½Π΅Ρ NULL, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΠΌΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΅ΡΡΡ, Π½ΠΎ Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, ΡΡΠ½ΠΊΡΠΈΡ getenv Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈ Π²Π΅ΡΠ½Π΅Ρ ΠΏΡΡΡΡΡ ΡΡΡΠΎΠΊΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ Π±Π°ΠΉΡ ΡΠ°Π²Π΅Π½ NULL. Π‘ΡΡΠΎΠΊΠ°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠ°Ρ getenv, Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ Π΅Π΅ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΡΠΎΠΊΡ Π² Π΄ΡΡΠ³ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½Π° ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π²ΡΠ·ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ getenv.
Π€ΡΠ½ΠΊΡΠΈΡ putenv ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ Π²ΠΈΠ΄Π° ΠΈΠΌΡ=Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π΅Π΅ Π² ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅. ΠΠ½Π° Π΄Π°ΡΡ ΡΠ±ΠΎΠΉ ΠΈ Π²Π΅ΡΠ½Π΅Ρ -1, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Π½Π΅Ρ Π²Π°ΡΠΊΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎΠ³Π΄Π° ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ENOMEM.