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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° языкС сцСнариСв ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 88

Автор МСндСль ΠšΡƒΠΏΠ΅Ρ€

s/^ */\

/g

Π­Ρ‚Π° инструкция Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π² строкС Π½Π° символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки. ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ -- Π·Π°ΠΌΠ΅Π½Π° отступов Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π° пустыми строками.

Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° строк, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ, ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅, инструкции ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ инструкций Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ символами ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки.

/[0-9A-Za-z]/,/^$/{

/^$/d

}

Π’ этом случаС Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…, ΠΈΠ΄ΡƒΡ‰ΠΈΡ… подряд, пустых строк. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для установки однострочных ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² Π² Ρ„Π°ΠΉΠ»Π΅, оставляя, ΠΏΡ€ΠΈ этом, пустыС строки ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π°ΠΌΠΈ.

Быстрый способ установки Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… мСТстрочных ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² Π² тСкстовых Ρ„Π°ΠΉΠ»Π°Ρ… -- sed G filename.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования sed Π² сцСнариях ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π²:

1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 33-1

2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 33-2

3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-2

4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ A-3

5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-12

6. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-20

7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ A-13

8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ A-19

9. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-24

10. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10-9

11. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-33

12. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ A-2

13. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-10

14. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-8

15. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ A-11

16. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 17-11


Бсылки Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ sed, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°.


B.2. Awk

Awk -- это ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ язык ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ с синтаксисом, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ синтаксис языка C. Он ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ довольно ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ возмоТностСй, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΌΡ‹ рассмотрим лишь Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… -- Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΠΌΡ‹Π΅ Π² сцСнариях ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

Awk "Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚" ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ поля. По-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, поля -- это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов, ΠΎΡ‚Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ назначСния Π΄Ρ€ΡƒΠ³ΠΈΡ… символов, Π² качСствС раздСлитСля ΠΏΠΎΠ»Π΅ΠΉ. Awk Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ инструмСнтом для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со структурированными тСкстовыми Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, осбСнно с Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ.

Π’Π½ΡƒΡ‚Ρ€ΠΈ сцСнариСв ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΠ΄ awk, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² "строгиС" (ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅) ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки.

awk '{print $3}' $filename

# Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ содСрТимоС 3-Π³ΠΎ поля ΠΈΠ· Ρ„Π°ΠΉΠ»Π° $filename Π½Π° устройство stdout.


awk '{print $1 $5 $6}' $filename

# Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ содСрТимоС 1-Π³ΠΎ, 5-Π³ΠΎ ΠΈ 6-Π³ΠΎ ΠΏΠΎΠ»Π΅ΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° $filename.


Волько Ρ‡Ρ‚ΠΎ, ΠΌΡ‹ рассмотрСли дСйствиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ print. Π•Ρ‰Π΅, Π½Π° Ρ‡Π΅ΠΌ ΠΌΡ‹ остановимся -- это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Awk Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ сцСнариям ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ.

{ total += ${column_number} }

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ column_number ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ "total". Π§Ρ‚ΠΎΠ±Ρ‹, Π² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ вывСсти "total", ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ END, которая ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

END { print total }


КомандС END, соотвСтствуСт ΠΊΠΎΠΌΠ°Π½Π΄Π° BEGIN, которая ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования awk Π² сцСнариях ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π²:

1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11-10

2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 16-7

3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-24

4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 33-3

5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9-22

6. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11-16

7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 27-1

8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 27-2

9. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10-3

10. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-42

11. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9-26

12. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12-3

13. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9-12

14. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 33-11

15. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10-8


Π­Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ я Ρ…ΠΎΡ‚Π΅Π» Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± awk. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ссылки Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± awk, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°.


ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ C. ΠšΠΎΠ΄Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ смысл

Π’Π°Π±Π»ΠΈΡ†Π° C-1. "Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅" ΠΊΠΎΠ΄Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ

Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Бмысл ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 1 Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ ошибки let "var1 = 1/0" Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ошибки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ "Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль" ΠΈ ΠΏΡ€. 2 согласно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ Bash -- Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ использованиС встроСнных ΠΊΠΎΠΌΠ°Π½Π΄ Π’ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ довольно Ρ€Π΅Π΄ΠΊΠΎ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ возвращаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ 1 126 вызываСмая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·Π²Π°Π½ Π½Π° исполнСниС нСисполняСмый Ρ„Π°ΠΉΠ» 127 "ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°" ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана Π»ΠΈΠ±ΠΎ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния $PATH, Π»ΠΈΠ±ΠΎ с Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ написаниСм ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ 128 Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ exit exit 3.14159 ΠΊΠΎΠΌΠ°Π½Π΄Π° exit ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ цСлочислСнныС значСния, Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0 - 255 128+n Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Π°Ρ ошибка ΠΏΠΎ сигналу "n" kill -9 $PPID сцСнария $? Π²Π΅Ρ€Π½Π΅Ρ‚ 137 (128 + 9) 130 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Control-C Control-C -- это Π²Ρ‹Ρ…ΠΎΠ΄ ΠΏΠΎ сигналу 2, (130 = 128 + 2, см. Π²Ρ‹ΡˆΠ΅) 255* ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π½Π΅ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° exit -1 exit ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ цСлочислСнныС значСния, Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0 - 255

Богласно этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΊΠΎΠ΄Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ 1 - 2, 126 - 165 ΠΈ 255[ 67 ] ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому Π²Π°ΠΌ слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ употрСблСния этих ΠΊΠΎΠ΄ΠΎΠ² для своих Π½ΡƒΠΆΠ΄. Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ сцСнария с ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° exit 127, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти Π² Π·Π°ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈ поискС ошибок Π² сцСнарии (Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ ΠΎΠ½ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ "ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°"? Или это прСдусмотрСнный программистом ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ?). Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, программисты Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ exit 1, Π² качСствС Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ 1 ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ†Π΅Π»Ρ‹ΠΉ "Π±ΡƒΠΊΠ΅Ρ‚" ошибок, Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ двусмыслСнности, хотя ΠΈ ΠΎΠ± информативности -- Ρ‚ΠΎΠΆΠ΅.

НС Ρ€Π°Π· ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΠΈΡΡ‚Π΅ΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (см. /usr/include/sysexits.h), Π½ΠΎ эта систСматизация ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для программистов, ΠΏΠΈΡˆΡƒΡ‰ΠΈΡ… Π½Π° языках C ΠΈ C++. Автор Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, опрСдСляСмыС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ 64 - 113 (ΠΈ, само собой разумССтся -- 0, для обозначСния ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ), Π² соотвСтствии со стандартом C/C++. Π­Ρ‚ΠΎ сдСлало Π±Ρ‹ поиск ошибок Π±ΠΎΠ»Π΅Π΅ простым.

ВсС сцСнарии, ΠΏΡ€ΠΈΠ»Π°Π³Π°Π΅ΠΌΡ‹Π΅ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² соотвСтствиС с этим стандартом, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ случаСв, ΠΊΠΎΠ³Π΄Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΡ‚ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9-2.

ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $?, ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария, Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π² соотвСтствии с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Bash ΠΈΠ»ΠΈ sh. Под ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ csh ΠΈΠ»ΠΈ tcsh значСния ΠΌΠΎΠ³ΡƒΡ‚ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.


ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ D. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°

написано Stephane Chazelas ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ любая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ 3-Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ -- 0 (стандвртный Π²Π²ΠΎΠ΄, stdin), доступный для чтСния. И Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… -- 1 (stdout) ΠΈ 2 (stderr), доступныС для записи.

Π—Π°ΠΏΠΈΡΡŒ, Ρ‚ΠΈΠΏΠ° ls 2>&1, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π°, с устройства stderr Π½Π° устройство stdout.

Π’ соотвСтствии с соглашСниями, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π²Π²ΠΎΠ΄ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° с дСскриптором 0 (stdin), выводят Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ„Π°ΠΉΠ» с дСскриптором 1 (stdout), Π° сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… -- Π² Ρ„Π°ΠΉΠ» с дСскриптором 2 (stderr). Если ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ ΠΈΠ· этих Ρ‚Ρ€Π΅Ρ… дСскрипторов окаТСтся Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ, Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

bash$ cat /etc/passwd >&-

cat: standard output: Bad file descriptor

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ запускаСт xterm, Ρ‚ΠΎ ΠΎΠ½ сначала выполняСт ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, xterm Ρ‚Ρ€ΠΈΠΆΠ΄Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ устройства (/dev/pts/<n>, ΠΈΠ»ΠΈ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅).

ПослС этого, командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° наслСдуСт эти Ρ‚Ρ€ΠΈ дСскриптора, ΠΈ любая ΠΊΠΎΠΌΠ°Π½Π΄Π°, запускаСмая Π² этой ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅, Ρ‚Π°ΠΊ ΠΆΠ΅ наслСдуСт ΠΈΡ…. Π’Π΅Ρ€ΠΌΠΈΠ½ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ -- ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ (ΠΊΠ°Π½Π°Π» (ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€) ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅). ΠŸΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ локально (для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, для Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊΠΎΠΌΠ°Π½Π΄, для ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² while, if, case, for...) ΠΈΠ»ΠΈ глобально (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ exec).

ls > /dev/null -- ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ запуск ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ls с Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌ дСскриптором 1, присоСдинСнным ΠΊ устройству /dev/null.

bash$ lsof -a -p $$ -d0,1,2

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

bash 363 bozo 0u CHR 136,1 3 /dev/pts/1

bash 363 bozo 1u CHR 136,1 3 /dev/pts/1

bash 363 bozo 2u CHR 136,1 3 /dev/pts/1


bash$ exec 2> /dev/null

bash$ lsof -a -p $$ -d0,1,2

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

bash 371 bozo 0u CHR 136,1 3 /dev/pts/1

bash 371 bozo 1u CHR 136,1 3 /dev/pts/1

bash 371 bozo 2w CHR 1,3 120 /dev/null


bash$ bash -c 'lsof -a -p $$ -d0,1,2' | cat

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

lsof 379 root 0u CHR 136,1 3 /dev/pts/1

lsof 379 root 1w FIFO 0,0 7118 pipe

lsof 379 root 2u CHR 136,1 3 /dev/pts/1


bash$ echo "$(bash -c 'lsof -a -p $$ -d0,1,2' 2>&1)"

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

lsof 426 root 0u CHR 136,1 3 /dev/pts/1

lsof 426 root 1w FIFO 0,0 7520 pipe