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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 47

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

$ put junk

Summary: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° вторая строка

$ cat junk.H

строка тСкста

другая строка

@@@ you Sat Oct 1 13:34:07 EDT 1983 ΠΎΠ΄Π½Π° строка Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π°

2d

@@@ you Sat Oct 1 13:31:03 EDT 1983 создадим Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ»

$

Для получСния Π½ΡƒΠΆΠ½ΠΎΠΉ вСрсии Ρ„Π°ΠΉΠ»Π° Π² Ρ„Π°ΠΉΠ»Π΅ истории записаны ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ рСдактирования. ΠŸΠ΅Ρ€Π²Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΡΠ°ΠΌΡƒΡŽ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ, вторая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Π² ΠΏΡ€Π΅Π΄-ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ Ρ‚.Π΄. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² Π΅Π³ΠΎ ΡΡ‚Π°Ρ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, запуская ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ed.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ссли Π² измСняСмом Ρ„Π°ΠΉΠ»Π΅ Π΅ΡΡ‚ΡŒ строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Ρ‚Ρ€Π΅Ρ… символов. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ошибок описания ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ diff(1) (см. справочноС руководство ΠΏΠΎ UNIX) Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ строках, состоящих ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. ΠœΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ @@@ для раздСлСния ΠΊΠΎΠΌΠ°Π½Π΄ рСдактирования, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ такая строка являСтся Ρ€Π΅Π΄ΠΊΠΎΡΡ‚ΡŒΡŽ для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ тСкста.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ здСсь процСсс развития ΠΊΠΎΠΌΠ°Π½Π΄ put ΠΈ get, Π½ΠΎ ΠΈΠ·-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ объСма ΠΊΠ½ΠΈΠ³ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. Команда put ΠΏΡ€ΠΎΡ‰Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ get:

# put: install file into history


PATH=/bin:/usr/bin


case $# in

1) HIST=$1.H ;;

*) echo 'Usage: put file' 1>&2; exit 1 ;;

esac

if test ! -r $1

then

 echo "put: can't open $1" 1>&2

 exit 1

fi

trap 'rm -f /tmp/put.[ab]$$; exit 1' 1 2 15

echo -n 'Summary: '

read Summary


if get -o /tmp/put.a$$ $1 # previous version

then                      # merge pieces

 cp $1 /tmp/put.b$$       # current version

 echo"@@@ `getname` `date` $Summary" >>/tmp/put.b$$

 diff -e $1 /tmp/put.a$$ >>/tmp/put.b$$   # latest diffs

 sed -n '/^@@@/,$p' <$HIST >>/tmp/put.b$$ # old diffs

 overwrite $HIST cat /tmp/put.b$$ # put it back

else # make a new one

 echo "put: creating $HIST"

 cp $1 $HIST

 echo "@@@ `getname` `date` $Summary" >>$HIST

fi

rm -f /tmp/put.[ab]$$

ПослС считывания ΠΎΠ΄Π½ΠΎΠΉ строки сводки ΠΊΠΎΠΌΠ°Π½Π΄Π° put обращаСтся ΠΊ get для получСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° истории. Π€Π»Π°Π³ -ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ get ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π’ Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° get Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΉΠ» истории, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ошибки, ΠΈ put создаСт Ρ„Π°ΠΉΠ» истории. Если Ρ„Π°ΠΉΠ» истории сущСствуСт, Ρ‚ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… послС then создаСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°: самая послСдняя вСрсия, строка @@@, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° для прСобразования этой вСрсии Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ, старыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΈ строки Π’ ΠΊΠΎΠ½Ρ†Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» копируСтся Π² Ρ„Π°ΠΉΠ» истории с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ overwrite.

Команда get Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ put Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„Π»Π°Π³ΠΈ:

# get: extract file from history


PATH=/bin:/usr/bin


VERSION=0

while test "$1" != ""

do

 case "$1" in

 -i) INPUT=$2; shift ;;

 -o) OUTPUT=$2; shift ;;

 -[0-9]) VERSION=$1 ;;

 -*) echo "get: Unknown argument $i" 1>&2; exit 1 ;;

 *) case "$OUTPUT" in

 "") OUTPUT=$1 ;;

 *) INPUT=$1.H ;;

 esac

 esac

 shift

done

OUTPUT=${OUTPUT?"Usage: get [-o outfile] [-i file.H] file"}

INPUT=${INPUT-$OUTPUT.H}

test -r $INPUT || { echo "get: no file $INPUT" 1>&2; exit 1; }

trap 'rm -f /tmp/get.[ab]$$; exit 1' 1 2 15

# split into current version and editing commands

sed <$INPUT -n '1,/^@@@/w /tmp/get.a'$$'

/^@@@/,$w /tmp/get.b'$$

# perform the edits

awk </tmp/get.b$$ '

 /^@@@/ { count++ }

 !/^@@@/ && count > 0 && count <= - "$VERSION"

 END { print "$d"; print "w", "'$OUTPUT'" }

' | ed - /tmp/get.a$$

rm -f /tmp/get.[ab]$$

Π€Π»Π°Π³ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: -i ΠΈ -ΠΎ Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², β€” -[0-9] опрСдСляСт Π²Π΅Ρ€ΡΠΈΡŽ: -0 β€” новая вСрсия (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), -1 β€” прСдыдущая вСрсия ΠΈ Ρ‚.Π΄.). Π¦ΠΈΠΊΠ» ΠΏΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ организуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ while, test ΠΈ shift, Π° Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ for, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ (-i, -ΠΎ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΈ поэтому Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ shift, которая ΠΏΠ»ΠΎΡ…ΠΎ согласуСтся с Ρ†ΠΈΠΊΠ»ΠΎΠΌ for, Ссли ΠΎΠ½Π° находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ. Π€Π»Π°Π³ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ed ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ числа символов, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈ записи Π² Ρ„Π°ΠΉΠ».

Π‘Ρ‚Ρ€ΠΎΠΊΠ°

test -r $INPUT || {echo "get: no file $INPUT" 1>&2; exit 1;}

эквивалСнтна конструкции

if test ! -r $INPUT

then

 echo "get: no file $INPUT" 1>&2

 exit 1

fi

(Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΌΡ‹ использовали Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ put), Π½ΠΎ запись Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‡Π΅, ΠΈ ΠΎΠ½Π° понятнСС программистам, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ||. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ { ΠΈ }, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ, Π° исходным ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π° exit обСспСчивала Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· get, Π° Π½Π΅ ΠΈΠ· ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ { ΠΈ } ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ do ΠΈ done β€” ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°ΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния, Ссли ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π·Π° Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой, символом ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ символом Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ рассмотрим Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² get, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡Ρƒ. Π’Π½Π°Ρ‡Π°Π»Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° sed Ρ„Π°ΠΉΠ» истории разбиваСтся Π½Π° Π΄Π²Π΅ части, содСрТащиС ΡΠ°ΠΌΡƒΡŽ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ рСдактирования. Π—Π°Ρ‚Π΅ΠΌ Π² awk-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ рСдактирования. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ @@@ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ (Π½ΠΎ Π½Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ), ΠΈ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΡ… число Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€Π° Π½ΡƒΠΆΠ½ΠΎΠΉ вСрсии, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ рСдактирования ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ (Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ дСйствиС, принятоС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π² awk-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сводится ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки). К ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ рСдактирования ΠΈΠ· Ρ„Π°ΠΉΠ»Π° истории Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΅Ρ‰Π΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ed: $d удаляСт ΠΎΠ΄Π½Ρƒ строку @@@, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ sed оставил Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии, Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° w ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π² ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π΅ΠΌΡƒ мСсто. Команда overwrite здСсь Π½Π΅ Π½ΡƒΠΆΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² get измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вСрсия Ρ„Π°ΠΉΠ»Π°, Π° Π½Π΅ сам Ρ„Π°ΠΉΠ» истории.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.29

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ version, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ Π΄Π²Π° задания:

$ version -5 Ρ„Π°ΠΉΠ»

Π²Ρ‹Π΄Π°Π΅Ρ‚ сводку ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π΄Π°Ρ‚Ρƒ измСнСния ΠΈ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΡˆΠ΅Π³ΠΎ измСнСния Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° истории вСрсии, Π°

$ version sep 20 Ρ„Π°ΠΉΠ»

Π²Ρ‹Π΄Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ вСрсии, ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ 20 ΡΠ΅Π½Ρ‚ября. Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС этой возмоТности ясно ΠΈΠ· обращСния:

$ get 'version sep 20 Ρ„Π°ΠΉΠ»'

(Команда version ΠΌΠΎΠΆΠ΅Ρ‚ для удобства ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ эхо ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° истории.)

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.30

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ get ΠΈ put Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»ΠΎΠΌ истории ΠΎΠ½ΠΈ использовали ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π° Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.31

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ всС вСрсии. Как Π±Ρ‹ Π²Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ вСрсий ΠΈΠ· сСрСдины Ρ„Π°ΠΉΠ»Π° истории?

5.10 Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Когда ΠΏΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ встаСт Π·Π°Π΄Π°Ρ‡Π° Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ СстСствСнноС ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π° своСм любимом языкС программирования. Для нас Ρ‚Π°ΠΊΠΈΠΌ языком Ρ‡Π°Ρ‰Π΅ всСго оказываСтся shell, хотя синтаксис Π΅Π³ΠΎ нСсколько Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π΅Π½. Shell β€” ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ язык программирования. БСзусловно, это язык высокого уровня: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π² Π½Π΅ΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ†Π΅Π»Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ Π΄ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ состояния нСбольшими шагами. Π”Π°Π»Π΅Π΅, Ссли ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пользования, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ "Π²Ρ‹Π»ΠΈΠ·Ρ‹Π²Π°Ρ‚ΡŒ" ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ Π² расчСтС Π½Π° ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ ΠΊΡ€ΡƒΠ³ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ Ρ‚Π΅Ρ… Ρ€Π΅Π΄ΠΊΠΈΡ… случаях, ΠΊΠΎΠ³Π΄Π° shell-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° оказываСтся нСэффСктивной, Ρ‡Π°ΡΡ‚ΡŒ Π΅Π΅ ΠΈΠ»ΠΈ вся ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСписана Π½Π° языкС Π‘ΠΈ, Π½ΠΎ Π½Π° основС ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° с Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. (Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ нСсколько Ρ€Π°Π· ΠΏΡ€ΠΎΠΉΠ΄Π΅ΠΌ этот ΠΏΡƒΡ‚ΡŒ.)

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π΅Π½ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π° UNIX β€” Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π΅ с нуля, Π° Π½Π° Π±Π°Π·Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сдСлали Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΈΠ΄Ρ‚ΠΈ ΠΎΡ‚ простого ΠΊ слоТному, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ срСдства для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ΄Π΅ΠΉ.

Π’ настоящСй Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ языка shell ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Иногда достаточно лишь ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ сдСлано Π² случаС с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ cal. Иногда ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Ρ†ΠΈΠΊΠ»Ρ‹ языка shell ΠΏΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ (см., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, watchfor ΠΈΠ»ΠΈ checkmail). Для Π±ΠΎΠ»Π΅Π΅ слоТных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² всС Ρ€Π°Π²Π½ΠΎ трСбуСтся мСньшС усилий, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° Π‘ΠΈ. Π’Π°ΠΊ, наша вСрсия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ news Π½Π° языкС shell замСняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Π‘ΠΈ Π² 350 (!) строк.

Однако Π΄Π΅Π»ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌ языкС. НСдостаточно ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈ мноТСство ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ согласованно ΠΈ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ соглашСний ΠΎ прСдставлСнии ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π―Π·Ρ‹ΠΊ shell позволяСт всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ встаСт новая Π·Π°Π΄Π°Ρ‡Π°, ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ простым ΠΈ эффСктивным способом. ИмСнно интСграция β€” ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° высокой продуктивности ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π° UNIX.