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

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

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

wait # ОТиданиС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ.


diff list123 list456

ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π²/ΠΈΠ· ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ производится ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ построСния ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° "|", Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ls -al | (command).

Π‘Π»ΠΎΠΊ ΠΊΠΎΠΌΠ°Π½Π΄, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ запуску Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

{ command1; command2; command3; ... }


Π“Π»Π°Π²Π° 20. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½Ρ‹Π΅ Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ

Запуск сцСнария ΠΈΠ»ΠΈ Π΅Π³ΠΎ части Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ налоТСнию ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° использованиС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄. Π­Ρ‚Π° ΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ограничСния ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ сцСнарий, ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΡƒΡ‰Π΅Ρ€Π±Π° систСмС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ нанСсти сцСнарий.

Π’ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° cd -- смСна Ρ‚Π΅ΠΊΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния $PATH, $SHELL, $BASH_ENV ΠΈ $ENV.

Π—Π°ΠΏΠ΅Ρ€Ρ‰Π΅Π½ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $SHELLOPTS.

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π°.

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ Π²Ρ‹Π·ΠΎΠ² ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ символ "слэш" (/).

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ Π²Ρ‹Π·ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ exec для запуска Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса.

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сцСнарий для выполнСния нСпрСдусмотрСнных дСйствий.

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 20-1. Запуск сцСнария Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅

#!/bin/bash

# Если sha-bang Π·Π°Π΄Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅: "#!/bin/bash -r"

# Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° запуска скрипта.


echo


echo "Π‘ΠΌΠ΅Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°."

cd /usr/local

echo "Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³: `pwd`"

echo "ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² домашний ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³."

cd

echo "Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³: `pwd`"

echo


# Π”ΠΎ сих ΠΏΠΎΡ€ сцСнарий исполнялся Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ, Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.


set -r

# set --restricted ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт.

echo "==> ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ. <=="


echo

echo


echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅."

cd ..

echo "Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ остался ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ: `pwd`"


echo

echo


echo "\$SHELL = $SHELL"

echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° смСны ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅."

SHELL="/bin/ash"

echo

echo "\$SHELL= $SHELL"


echo

echo


echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° пСрСнаправлСния Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅."

ls -l /usr/bin > bin.files

ls -l bin.files # ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ.


echo


exit 0


Π“Π»Π°Π²Π° 21. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° процСссов

ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° процСссов -- это Π°Π½Π°Π»ΠΎΠ³ подстановки ΠΊΠΎΠΌΠ°Π½Π΄. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ подстановки ΠΊΠΎΠΌΠ°Π½Π΄ записываСт Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, dir_contents=`ls -al` ΠΈΠ»ΠΈ xref=$(grep word datafile). ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ подстановки процСссов ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π½Π° Π²Π²ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ (Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ -- Π΄Ρ€ΡƒΠ³ΠΎΠΉ).

Π¨Π°Π±Π»ΠΎΠ½ подстановки ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок

>(command)

<(command)

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ инициируСтся подстановка процСссов. Π—Π΄Π΅ΡΡŒ, для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ /dev/fd/<n>.[ 49 ]

ΠœΠ΅ΠΆΠ΄Ρƒ ΠΊΡ€ΡƒΠ³Π»ΠΎΠΉ скобкой ΠΈ символом "<" ΠΈΠ»ΠΈ ">", Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС.

bash$ echo >(true)

/dev/fd/63


bash$ echo <(true)

/dev/fd/63

Bash создаСт ΠΊΠ°Π½Π°Π» с двумя Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ дСскрипторами, --fIn ΠΈ fOut--. stdin ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ true присоСдиняСтся ΠΊ fOut (dup2(fOut, 0)), Π·Π°Ρ‚Π΅ΠΌ Bash ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ /dev/fd/fIn Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅ echo. Π’ систСмах, Π³Π΄Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ /dev/fd/<n>, Bash ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. (Бпасибо S.C.)

cat <(ls -l)

# Π’ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ls -l | cat


sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin)

# Бписок Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚Ρ€Π΅Ρ… основных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… 'bin', отсортированный ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ².

# ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π½Π° Π²Ρ…ΠΎΠ΄ 'sort' ΠΏΠΎΠ΄Π°Π½Ρ‹ Ρ‚Ρ€ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.


diff <(command1) <(command2) # Выдаст различия Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄.


tar cf >(bzip2 -c > file.tar.bz2) $directory_name

# Π’Ρ‹Π·ΠΎΠ²Π΅Ρ‚ "tar cf /dev/fd/?? $directory_name" ΠΈ Π·Π°Ρ‚Π΅ΠΌ "bzip2 -c > file.tar.bz2".

#

# Из-Π·Π° особСнностСй, присущих Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ систСмам, связанным с /dev/fd/<n>,

# ΠΊΠ°Π½Π°Π» ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ.

#

# Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ.

#

bzip2 -c < pipe > file.tar.bz2&

tar cf pipe $directory_name

rm pipe

# ΠΈΠ»ΠΈ

exec 3>&1

tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&- | bzip2 -c > file.tar.bz2 3>&-

exec 3>&-


# Бпасибо S.C.


НиТС приводится Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‡Π΅Π½ΡŒ интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования подстановки процСссов.

# Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ сцСнария ΠΈΠ· дистрибутива SuSE:


while read des what mask iface; do

# НСкоторыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ...

done < <(route -n)


# Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ ΠΊΠ°ΠΊΠΈΠ΅ Π»ΠΈΠ±ΠΎ дСйствия.

while read des what mask iface; do

echo $des $what $mask $iface

done < <(route -n)


# Π’Ρ‹Π²ΠΎΠ΄ Π½Π° экран:

# Kernel IP routing table

# Destination Gateway Genmask Flags Metric Ref Use Iface

# 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo


# Как ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ S.C. -- Π±ΠΎΠ»Π΅Π΅ простой для понимания эквивалСнт:

route -n |

while read des what mask iface; do # ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Π΅Ρ€ΡƒΡ‚ значСния с устройства Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° (ΠΊΠ°Π½Π°Π»Π°).

echo $des $what $mask $iface

done # На экран выводится Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹ΡˆΠ΅.

# Однако, Ulrich Gayer ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ ...

#+ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ запускаСт Ρ†ΠΈΠΊΠ» while Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅,

#+ ΠΈ поэтому ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°, послС закрытия ΠΊΠ°Π½Π°Π»Π°.


Π“Π»Π°Π²Π° 22. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

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

function function_name { command... }

ΠΈΠ»ΠΈ

function_name () { command... }


Вторая Ρ„ΠΎΡ€ΠΌΠ° записи Π±Π»ΠΈΠΆΠ΅ ΠΊ сСрдцу C-программистам (ΠΎΠ½Π° ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ пСрСносимая).

Как ΠΈ Π² языкС C, скобка, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС.

function_name () { command... }


Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ осущСствляСтся простым ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΈ Π² тСкстС сцСнария.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 22-1. ΠŸΡ€ΠΎΡΡ‚Π°Ρ функция

#!/bin/bash


funky ()

{

echo "Π­Ρ‚ΠΎ обычная функция."

} # Ѐункция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.


# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.


funky


exit 0

Ѐункция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. К соТалСнию, Π² Bash Π½Π΅Ρ‚ возмоТности "ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ объявлСния" Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² C.

f1

# Π­Ρ‚Π° строка Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция "f1" Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°.


declare -f f1 # Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

f1 # По ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ -- сообщСниС ΠΎΠ± ошибкС.


# Однако...


f1 ()

{

echo "Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ \"f2\" ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ \"f1\"."

f2

}


f2 ()

{

echo "Ѐункция \"f2\"."

}


f1 # Ѐункция "f2", фактичСски, Π½Π΅ вызываСтся Π²Ρ‹ΡˆΠ΅ этой строки,

#+ хотя ссылка Π½Π° Π½Π΅Π΅ встрСчаСтся Π²Ρ‹ΡˆΠ΅, Π΄ΠΎ Π΅Π΅ объявлСния.

# Π­Ρ‚ΠΎ допускаСтся.


# Бпасибо S.C.


ДопускаСтся Π΄Π°ΠΆΠ΅ созданиС Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, хотя ΠΏΠΎΠ»ΡŒΠ·Ρ‹ ΠΎΡ‚ этого Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ.

f1 ()

{


f2 () # влоТСнная

{

echo "Ѐункция \"f2\", влоТСнная Π² \"f1\"."

}


}


f2 # Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС.

# Π”Π°ΠΆΠ΅ "declare -f f2" Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.


echo


f1 # НичСго Π½Π΅ происходит, простой Π²Ρ‹Π·ΠΎΠ² "f1", Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ автоматичСский Π²Ρ‹Π·ΠΎΠ² "f2".

f2 # Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π²Ρ‹Π·ΠΎΠ² "f2" Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию ошибки,

#+ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция "f2" Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² процСссС Π²Ρ‹Π·ΠΎΠ²Π° "f1".


# Бпасибо S.C.


ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² самых Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… мСстах.

ls -l | foo() { echo "foo"; } # Допустимо, Π½ΠΎ бСсполСзно.


if [ "$USER" = bozo ]

then

bozo_greet () # ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π² условном ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅.

{

echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Bozo!"

}

fi


bozo_greet # Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ bozo, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ сообщСниС ΠΎΠ± ошибкС.


# НСчто ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎΠΉ пользой для сСбя.

NO_EXIT=1 # Will enable function definition below.


[[ $NO_EXIT -eq 1 ]] && exit() { true; } # ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ "И-список".

# Если $NO_EXIT Ρ€Π°Π²Π½Π° 1, Ρ‚ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ "exit ()".

# Π’Π΅ΠΌ самым, функция "exit" подмСняСт Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ "exit".


exit # ВызываСтся функция "exit ()", Π° Π½Π΅ встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° "exit".


# Бпасибо S.C.


22.1. Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ слоТности с функциями

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

function_name $arg1 $arg2

Доступ ΠΊ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, Π² функциях, производится посрСдством ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚.Π΅. $1, $2 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.