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

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

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

104Β  {"ignore-environment", no_argument, NULL, 'i'},

105Β  {"unset", required_argument, NULL, 'u'},

106Β  {GETOPT_HELP_OPTION_DECL},

107Β  {GETOPT_VERSION_OPTION_DECL},

108Β  {NULL, 0, NULL, 0}

109 };

GNU Coreutils содСрТит большоС число ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΎΠ±Ρ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π½Π°Π»ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). Для облСгчСния сопровоТдСния ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠ΄ΠΈΠΎΠΌΡ‹ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π²ΠΈΠ΄Π΅ макросов. Двумя Ρ‚Π°ΠΊΠΈΠΌ макросами ΡΠ²Π»ΡΡŽΡ‚ΡΡ

GETOPT_HELP_OPTION_DECL
ΠΈ
GETOPT_VERSION_OPTION
(строки 106 ΠΈ 107). ВскорС ΠΌΡ‹ рассмотрим ΠΈΡ… опрСдСлСния. ΠŸΠ΅Ρ€Π²Π°Ρ функция,
usage()
, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠœΠ°ΠΊΡ€ΠΎΡ
_("string")
(строка 115, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅) Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ считайтС Π΅Π³ΠΎ содСрТащим ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу.

111 void

112 usage(int status)

113 {

114 Β if (status '= 0)

115Β Β  fprintf(stderr, _("Try '%s --help' for more information.\n"),

116Β Β Β  program_name);

117Β  else

118Β  {

119Β Β  printf (_("\

120Β Β Β  Usage: %s [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]\n"),

121Β Β Β  program_name);

122Β Β  fputs (_("\

123Β Β Β  Set each NAME to VALUE in the environment and run COMMAND. \n\

124Β Β Β  \n\

125Β Β Β  -i, --ignore-environment start with an empty environment\n\

126Β Β Β  -u, --unset=NAME remove variable from the environment\n\

127Β Β Β  "), stdout);

128Β Β  fputs(HELP_OPTION_DESCRIPTION, stdout);

129Β Β  fputs(VERSION_OPTION_DESCRIPTION, stdout);

130Β Β  fputs(_("\

131Β Β Β  \n\

132Β Β Β  A mere - implies -i. If no COMMAND, print the resulting\

133Β Β Β  environment.\n"), stdout);

134Β Β  printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);

135Β  }

136Β  exit(status);

137 }

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ

main()
ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ настраиваСт Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ
setlocale()
,
bindtextdomain()
ΠΈ
textdomain()
(строки 147–149) ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 13 Β«Π˜Π½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ локализация». ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
main() envp
(строка 140). Π­Ρ‚ΠΎ СдинствСнная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Coreutils, которая Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π΅Ρ‚. НаконСц, Π²Ρ‹Π·ΠΎΠ²
atexit()
Π² строкС 151 (см. Ρ€Π°Π·Π΄Π΅Π» 9.1.5.3. Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡΒ») рСгистрируСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Coreutils, которая ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ всС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚
stdout
, выдавая сообщСниС ΠΏΡ€ΠΈ ошибкС. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ
getopt_long()
.

139 int

140 main(register int argc, register char **argv, char **envp)

141 {

142 Β char *dummy_environ[1];

143 Β int optc;

144Β  int ignore_environment = 0;

145

146Β  program_name = argv[0];

147Β  setlocale(LC_ALL, "");

148Β  bindtextdomain(PACKAGE, LOCALEDIR);

149Β  textdomain(PACKAGE);

150

151Β  atexit(close_stdout);

152

153Β  while ((optc = getopt_long(argc, argv, "+iu:", longopts, NULL)) != -1)

154Β  {

155Β Β  switch (optc)

156Β Β  {

157Β Β Β case 0:

158Β Β Β  break;

159Β Β  case 'i':

160Β Β Β  ignore_environment = 1;

161Β Β Β  break;

162Β Β  case 'u':

163Β Β Β  break;

164Β Β  case_GETOPT_HELP_CHAR;

165Β Β  case_GETOPT_VERSION_CHAR(PROGRAM_NAME, AUTHORS);

166Β Β  default:

167Β Β Β  usage(2);

168Β Β  }

169Β  }

170

171Β  if (optind != argc && !strcmp(argv[optind], "-"))

172Β Β  ignore_environment = 1;

Π’ΠΎΡ‚ ΠΎΡ‚Ρ€Ρ‹Π²ΠΎΠΊ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

src/sys2.h
Π² дистрибутивС Coreutils с упомянутыми Ρ€Π°Π½Π΅Π΅ опрСдСлСниями ΠΈ макросом '
case_GETOPT_xxx
', ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ (строки 164–165):

/* ВынСсСниС Π·Π° скобки ΠΎΠ±Ρ‰Π΅ΠΉ части ΠΊΠΎΠ΄Π°, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ --help ΠΈ

Β  Β --version. */

/* Π­Ρ‚ΠΈ значСния пСрСчислСния Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ со значСниями ΠΎΠΏΡ†ΠΈΠΉ,

Β  Β ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ CHAR_MAX + 1 ΠΈ Ρ‚.Π΄. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅

Β  Β CHAR_MIN - 1, Ρ‚.ΠΊ. ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ -1, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ†ΠΈΠΉ getopt.

*/

enum {

Β GETOPT_HELP_CHAR = (CHAR_MIN β€” 2),

Β GETOPT_VERSION_CHAR = (CHAR_MIN - 3)

};