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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 13

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ясно, Ρ‡Ρ‚ΠΎ getopt_long() прСдоставляСт Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΎΠΏΡ†ΠΈΠΉ. Π’ Ρ‚Π°Π±Π». 2.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° сводка всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.


Π’Π°Π±Π»ΠΈΡ†Π° 2.2. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния getopt_long()

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 getopt_long() установила Ρ„Π»Π°Π³, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ 1 optarg ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° простой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки '?' ΠΠ΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опция ' ' ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ 'x' Π‘ΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡ†ΠΈΠΈ 'x' -1 ΠšΠΎΠ½Π΅Ρ† ΠΎΠΏΡ†ΠΈΠΉ

НаконСц, ΠΌΡ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ°Π·Π°Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ switch ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ:

int do_all, do_help, do_verbose; /* Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ */

char *myfile, *user; /* Ρ„Π°ΠΉΠ» Π²Π²ΠΎΠ΄Π°, имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ */

struct option longopts[] = {

 { "all", no_argument, &do_all, 1 },

 { "file", required_argument, NULL, 'f'},

 { "help", no_argument, &do_help, 1 },

 { "verbose", no_argument, &do_verbose, 1 },

 { "user" , optional_argument, NULL, 'u'},

 { 0, 0, 0, 0 }

};

...

while((c=getopt_long(argc, argv, ":ahvf:u::W;", longopts, NULL)) != -1) {

 switch (c) {

 case 'a':

  do_all = 1;

  break;

 case 'f':

  myfile = optarg;

  break;

 case 'h':

  do_help = 1;

  break;

 case 'u':

  if (optarg != NULL)

   user = optarg;

  else

   user = "root";

  break;

 case 'v':

  do_verbose = 1;

  break;

 case 0:

  /* getopt_long() установил ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, просто ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ */

  break;

#if 0

 case 1:

  /*

   * Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот case, Ссли getopt_long() Π΄ΠΎΠ»ΠΆΠ½Π°

   * ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π’ этом случаС Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ

   * optstring Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ * символ '-'. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄,

   * Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ здСсь.

   */

  break;

#endif

 case ':': /* отсутствуСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ */

  fprintf(stderr, "%s: option '-%c' requires an argument\n",

   argv[0], optopt);

  break;

 case '?':

 default: /* Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опция */

  fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",

   argv[0], optopt);

  break;

 }

}

Π’ своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠ΅ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако, Ссли Π²Ρ‹ использовали ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа ΠΎΠΏΡ†ΠΈΠΈ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΡƒΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ Π½ΡƒΠΆΠ½Ρ‹. (Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ do_verbose ΠΈ vflag.)

2.3.3.4. GNU getopt() ΠΈΠ»ΠΈ getopt_long() Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… GNU getopt() ΠΈΠ»ΠΈ getopt_long() ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Π½Π΅-Linux систСмах/ Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ; просто скопируйтС исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ GNU ΠΈΠ»ΠΈ ΠΈΠ· CVS Π°Ρ€Ρ…ΠΈΠ²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ GNU (GLIBC)[30]. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ getopt.h, getopt.с ΠΈ getopt1.c. Они Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° условиях мСньшСй общСдоступной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ (Lesser General Public License) GNU, которая позволяСт Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°ΠΆΠ΅ Π² ΠΏΠ°Ρ‚Π΅Π½Ρ‚ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ копию Ρ„Π°ΠΉΠ»Π° COPYING.LIB наряду с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ getopt.h, getopt.с ΠΈ getopt1.с.

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π² свой дистрибутив ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ исходными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’ исходном ΠΊΠΎΠ΄Π΅, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ getopt_long(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ '#include <getopt.h>', Π° Π½Π΅ '#include "getopt.h"'. Π—Π°Ρ‚Π΅ΠΌ, ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС компилятора Π‘ -I. Π’Π°ΠΊΠΈΠΌ способом сначала Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° локальная копия Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ: Β«Π’ΠΎΡ‚ Ρ‚Π°ΠΊ, я ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ GNU/Linux. ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ getopt_long() Π² свой исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, увСличивая Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, Ссли ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΡƒΠΆΠ΅ находится Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π‘?Β» Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ вопрос. Однако, здСсь Π½Π΅ ΠΎ Ρ‡Π΅ΠΌ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ построСн Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ссли ΠΎΠ½ компилируСтся Π½Π° систСмС, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ GLIBC, ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°! Π’ΠΎΡ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° нашСй систСмС:

$ uname -Π° /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ имя ΠΈ Ρ‚ΠΈΠΏ систСмы */

Linux example 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux

$ ls -l getopt.ΠΎ getopt1.ΠΎ /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² */

-rw-r--r-- 1 arnold devel 9836 Mar 24 13:55 getopt.ΠΎ

-rw-r--r-- 1 arnold devel 10324 Mar 24 13:55 getopt1.ΠΎ

$ size getopt.ΠΎ getopt1.ΠΎ /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² исполняСмый

ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ */

text data bss dec hex filename

0 0 0 0 0 getopt.ΠΎ

0 0 0 0 0 getopt1.ΠΎ

Команда size ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… составных частСй Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π°. ΠœΡ‹ объясним Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.1 «АдрСсноС пространство Linux/UnixΒ». Π§Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ прямо сСйчас, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ нСсмотря Π½Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ самих Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠ½ΠΈ Π½Π΅ вносят Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΊΠ»Π°Π΄Π° Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. (Π”ΡƒΠΌΠ°Π΅ΠΌ, это достаточно ясно.)

2.4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ прСдставляСт собой Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€ Π²ΠΈΠ΄Π° 'имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅' для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Ρ‹ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния. КаТдоС имя состоит ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΎ любого числа Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… символов ΠΈΠ»ΠΈ символов подчСркивания ('_'), Π½ΠΎ имя Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Ρ†ΠΈΡ„Ρ€Ρ‹. (Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ контролируСтся ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ; Π‘ API ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ всС, Ρ‡Ρ‚ΠΎ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚, Π·Π° счСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ запутывания ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.)

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. НапримСр, Ссли Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ сущСствуСт POSIXLY_CORRECT, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ историчСскоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСсовмСстимы со стандартом POSIX.

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

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, нСдостатком использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠΎΠ»Ρ‡Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π”ΠΆΠΈΠΌ ΠœΠ΅ΠΉΠ΅Ρ€ΠΈΠ½Π³ (Jim Meyering), ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Coreutils, Π²Ρ‹Ρ€Π°Π·ΠΈΠ» это Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Они ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ настройку ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Π΅Π· измСнСния способа Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ благословСниСм, Ρ‚Π°ΠΊ ΠΈ проклятиСм. Если Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ сцСнарий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ зависит ΠΎΡ‚ значСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния, Π° Π·Π°Ρ‚Π΅ΠΌ этот сцСнарий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Ρ‰Π΅ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ, Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΆΠ΅ установок окруТСния, ΠΎΠ½ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ (ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, ΠΌΠΎΠ»Ρ‡Π° Π²Ρ‹Π΄Π°Ρ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹).

2.4.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ

НСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ эти значСния ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈΡ…. Π’ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ объявлСния:

#include <stdlib.h>


char *getenv(const char *name);

/* ISO Π‘: ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

   окруТСния */

int setenv(const char *name, /* POSIX: Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ */

           const char *value, /* окруТСния */

           int overwrite);

int putenv(char *string); /* XSI: Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

                             окруТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ строку */

void unsetenv(const char *name); /* POSIX: Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

                                    окруТСния */

int clearenv(void); /* ΠžΠ±Ρ‰Π΅Π΅: ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ всС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ */

Ѐункция getenv() β€” Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² 99% случаСв. Π•Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ, Ρ‚Π°ΠΊΠΎΠ΅, ΠΊΠ°ΠΊ Β«ΠΠžΠœΠ•Β» ΠΈΠ»ΠΈ Β«PATHΒ». Если пСрСмСнная сущСствуСт, getenv() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если Π½Π΅Ρ‚, возвращаСтся NULL. НапримСр:

char *pathval;

/* Поиск PATH; Ссли Π½Π΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

   ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ */

if ((pathval = getenv("PATH")) == NULL)

 pathval = "/bin:/usr/bin:/usr/ucb";

Иногда пСрСмСнная окруТСния сущСствуСт, Π½ΠΎ с пустым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π’ этом случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π²Π½ΠΎ NULL, Π½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π‘ являСтся символом ΠΊΠΎΠ½Ρ†Π° строки, '\0'. Π’Π°Ρˆ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π²Π½ΠΎ NULL. Если ΠΎΠ½ΠΎ Π½Π΅ NULL, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ строка Π½Π΅ пустая, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ любом случаС, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слСпо.