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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 66

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

unknown option: q

argument: hi there

На самом Π΄Π΅Π»Π΅ ΠΈ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ, ΠΈ исходныС ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ. Π”Π»ΠΈΠ½Π½Ρ‹ΠΌ опциям Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ сокращСнныС названия, Π½ΠΎ ΠΎΠ½ΠΈ

Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ. Π”Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² Π²ΠΈΠ΄Π΅ --опция= Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»Π΅Π΅:

$ <b>./longopt --init -l --file=fred.с 'hi there'</b>

option: i

option: l

filename: fred.с

argument: hi there

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° новая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° longopt.c, получСнная ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ argopt.c с измСнСниями, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ†Π²Π΅Ρ‚ΠΎΠΌ.

#include &lt;stdio.h&gt;

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

<i>#define _GNU_SOURCE</i>

<i>#include &lt;getopt.h&gt;</i>

int main(int argc, char *argv[]) {

Β int opt;

<i>Β struct option_longopts[] = {</i>

<i>Β  {&quot;initialize&quot;, 0. NULL, 'i'},</i>

<i>Β Β {&quot;file&quot; 1, NULL, 'f'},</i>

<i>Β Β {&quot;list&quot;, 0, NULL, 'l'},</i>

<i>Β {0, 0, 0, 0}};</i>

<i>Β while ((opt = getopt_long(argc, argv, &quot;:if:lr, longopts, NULL)) != -1) {</i>

Β  switch(opt) {

Β Β case 'i':

Β Β case 'l':

Β Β case 'r':

Β Β  printf(&quot;option: %c\n&quot;, opt);

Β  Β break;

Β Β case 'f':

Β Β  printf(&quot;filename: %s\n&quot;, optarg);

Β  Β break;

Β Β case ':':

Β Β  printf(&quot;option needs a value\n&quot;);

Β  Β break;

Β Β case '?':

Β  Β printf(&quot;unknown option: %c\n&quot;, optopt);

Β Β  break;

Β  }

Β }

Β for (; optind &lt; argc; optind++)

Β  printf(&quot;argument: %s\n&quot;, 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
, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ Π΅Π³ΠΎ исходный ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, стандартноС мСсто старта Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π΅Π΅ сСанса. Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· строки ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ:

$ <b>echo $НOΠœΠ•</b>

/home/neil

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ

set
для получСния списка всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния.