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

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

Автор ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ Π‘Ρ€Π°ΠΉΠ°Π½ Уилсон

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$$ '

Β <a href="">/^@@@/</a> { count++ }

Β !/^@@@/ &amp;&amp; count &gt; 0 &amp;&amp; count &lt;= - &quot;$VERSION&quot;

Β END { print &quot;$d&quot;; print &quot;w&quot;, &quot;'$OUTPUT'&quot; }

' | 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 &quot;get: no file $INPUT&quot; 1&gt;&amp;2; exit 1;}

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

if test ! -r $INPUT

then

Β echo &quot;get: no file $INPUT&quot; 1&gt;&amp;2

Β exit 1

fi

(Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΌΡ‹ использовали Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅

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

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ рассмотрим Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²

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