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

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

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

Рис. 2.1. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, patfile являСтся Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… для поиска, Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для использования fgrep Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ списка строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ.

2.1.1. БоглашСния POSIX

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

1. Π’ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄Π²ΡƒΡ… ΠΈ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ дСвяти символов.

2. Π˜ΠΌΠ΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ лишь строчныС символы ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹.

3. Π˜ΠΌΡ ΠΎΠΏΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ простым Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹ΠΌ символом. ΠžΠΏΡ†ΠΈΠΈ с мноТСством Ρ†ΠΈΡ„Ρ€ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ. Для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ POSIX, опция -W Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π° для спСцифичных для производитСля ΠΎΠΏΡ†ΠΈΠΉ.

4. Π’сС ΠΎΠΏΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с символа '-'.

5. Π”ля ΠΎΠΏΡ†ΠΈΠΉ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ объСдинСниС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ послС СдинствСнного символа '-'. (НапримСр, 'foo -a -b -c' ΠΈ 'foo -abc' Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.)

6. ΠšΠΎΠ³Π΄Π° ΠΎΠΏΡ†ΠΈΠΈ всС ΠΆΠ΅ трСбуСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΎΡ‚ ΠΎΠΏΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 'fgrep -f patfile').

Однако, стандарт допускаСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° опция ΠΈ Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС: 'fgrep -fpatfile'. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt() ΠΈ getopt_long() ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ '-fpatfile' ΠΊΠ°ΠΊ '-f patfile', Π° Π½Π΅ ΠΊΠ°ΠΊ '-f -p -a -t ...'.

7. ΠΡ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ†ΠΈΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ†ΠΈΠΈ трСбуСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ всСгда, ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ GNU getopt() всС ΠΆΠ΅ прСдусматриваСт Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ†ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹

8. Π•сли опция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ строки со значСниями, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ запятыми ΠΈΠ»ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ.

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ гипотСтичСской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ myprog трСбуСтся список ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ для ΠΎΠΏΡ†ΠΈΠΈ -u. Π”Π°Π»Π΅Π΅ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… способов:

myprog -u "arnold,joe,jane" /* Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ запятыми */

myprog -u "arnold joe jane" /* Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ */

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ‚.Π΅. здСсь Π½Π΅Ρ‚ стандартной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹), Π½ΠΎ ручная рСализация ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ проста.

9. ΠžΠΏΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ. ВСрсии getopt() Unix проводят Π² Тизнь это соглашСниС. GNU getopt() ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этого Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, хотя Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° это.

10. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ '--' ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ всСх ΠΎΠΏΡ†ΠΈΠΉ. ВсС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с Ρ‡Π΅Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ.

11. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρ€ΠΎΠ»ΠΈ. Однако, для Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° опция ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ установки Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Ρ‚ΠΎΠ³Π΄Π° (Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ) послСдняя ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚. Если опция, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, повторяСтся, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ порядку. НапримСр, 'myprog -u arnold -u jane' Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ 'myprog -u "arnold, jane"'. (Π’Π°ΠΌ придСтся ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ это ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ; getopt() Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.)

12. ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. КаТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ.

13. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ '-' ΠΊΠ°ΠΊ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ стандартный Π²Π²ΠΎΠ΄ ΠΈΠ»ΠΈ стандартный Π²Ρ‹Π²ΠΎΠ΄, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ стандартныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ всСм ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ соглашСниям. Π“Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ являСтся историчСская ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ; ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈ систСматизации этих соглашСний.

2.1.2. Π”Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ GNU

Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 1.4.2 «ПовСдСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ», ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ GNU рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ --help, --verbose ΠΈ Ρ‚.Π΄. Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с '--', Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚ с соглашСниями POSIX. Π˜Ρ… Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅Π³Ρ‡Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΈ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ срСди всСх ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ GNU. (НапримСр, --help являСтся Π²Π΅Π·Π΄Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ -h для Β«helpΒ», -i для Β«informationΒ» ΠΈ Ρ‚.Π΄.) Π”Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ GNU ΠΈΠΌΠ΅ΡŽΡ‚ свои собствСнныС соглашСния, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt_long():

1. Π£ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… инструмСнты POSIX, каТдая короткая опция (ΠΎΠ΄ΠΈΠ½ символ) Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ свой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π² Π²ΠΈΠ΄Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ.

2. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ спСцифичСскиС для GNU ΠΎΠΏΡ†ΠΈΠΈ Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ, Π½ΠΎ ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

3. Π”Π»ΠΈΠ½Π½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄ΠΎ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅ΠΉ строки, которая остаСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ. НапримСр, Ссли Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΎΠΏΡ†ΠΈΠΈ --verbose ΠΈ --verbatim, самыми ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ сокращСниями Π±ΡƒΠ΄ΡƒΡ‚ --verbo ΠΈ --verba.

4. ΠΡ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ Π»ΠΈΠ±ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ, Π»ΠΈΠ±ΠΎ символом =. НапримСр, --sourcefile=/some/file ΠΈΠ»ΠΈ --sourcefile /some/file.

5. ΠžΠΏΡ†ΠΈΠΈ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ заинтСрСсованы Π² ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, getopt_long() пСрСставляСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сначала ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ всС ΠΎΠΏΡ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ всС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ доступны ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. (Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ.)

6. ΠΡ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Для Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ считаСтся, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ присутствуСт, Ссли ΠΎΠ½ находится Π² ΠΎΠ΄Π½ΠΎΠΉ строкС с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лишь для ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ. НапримСр, Ссли -Ρ… такая опция ΠΈ Π΄Π°Π½Π° строка 'foo -Ρ…YANKEES -y', Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ -Ρ… являСтся 'YANKEES'. Для 'foo -Ρ… -y' Ρƒ -Ρ… Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

7. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ опциям Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с ΠΎΠ΄Π½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ (Π­Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ X Window.)

МногоС ΠΈΠ· этого станСт яснСС, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ·ΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим getopt_long().

GNU Coding Standards удСляСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ мСсто ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ всСх Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ GNU. Если Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ, посмотритС, Π½Π΅Ρ‚ Π»ΠΈ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ ΠΈΠΌΠ΅Π½ ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Π°ΠΌ.

2.2. Базовая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Π‘ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ своим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ argc ΠΈ argv. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ argc являСтся Ρ†Π΅Π»Ρ‹ΠΌ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ число ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π•ΡΡ‚ΡŒ Π΄Π²Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… способа опрСдСлСния main(), ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ способом объявлСния argc:

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

{                                 {

...                                ...

}                                 }

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя этими объявлСниями Π½Π΅Ρ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, хотя ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ понятно: argc являСтся массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° символы. А Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ тСхничСски Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ. На рис. 2.2 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° эта ситуация.

Рис. 2.2. ΠŸΠ°ΠΌΡΡ‚ΡŒ для argc

По соглашСнию, argv[0] являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. (Π”Π΅Ρ‚Π°Π»ΠΈ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.1.4.3. «ИмСна ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ argv[0]Β».) ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. ПослСдним элСмСнтом массива argv являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ NULL.

argc ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько имССтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²; ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π‘ индСксы ΠΎΡ‚ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ с нуля, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 'argv[argc] == NULL' всСгда Π²Π΅Ρ€Π½ΠΎ. Из-Π·Π° этого, особСнно Π² ΠΊΠΎΠ΄Π΅ для Unix, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ окончания списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ» с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ счСтчик прСвысил argc, ΠΈΠ»ΠΈ 'argv[i] == 0', ΠΈΠ»ΠΈ '*argv != NULL' ΠΈ Ρ‚.Π΄. Они всС эквивалСнтны.

2.2.1. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° echo V7

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° V7 echo, ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π°Ρ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² стандартный Π²Ρ‹Π²ΠΎΠ΄, раздСляя ΠΈΡ… ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ символом ΠΊΠΎΠ½Ρ†Π° строки. Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся -n, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ символ Π½ΠΎΠ²ΠΎΠΉ строки опускаСтся. (Π­Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠΉ ΠΈΠ· сцСнариСв ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.) Π’ΠΎΡ‚ ΠΊΠΎΠ΄[28]:

1  #include <stdio.h>

2

3  main(argc, argv) /*int main(int argc, char **argv)*/

4  int argc;

5  char *argv[];

6  {

7   register int i, nflg;