<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sveshnikov.ru - это наилучший источник информации по теме unix perl shell и всего такого &#187; bash</title>
	<atom:link href="http://alexey.sveshnikov.ru/blog/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexey.sveshnikov.ru/blog</link>
	<description>bookmarks-on-tranquilizers</description>
	<lastBuildDate>Tue, 25 May 2010 20:30:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Чудеса!!</title>
		<link>http://alexey.sveshnikov.ru/blog/2008/06/06/hackers-sed-tetris/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2008/06/06/hackers-sed-tetris/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 08:27:10 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[tetris]]></category>
		<category><![CDATA[чудеса]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=67</guid>
		<description><![CDATA[Я страсть как люблю хакерские программки, которые удивляют самим фактом своего существования. Одна из таких: тетрис на sed&#8217;е. Это что-то невероятное! p.s. да, и я тоже, оказывается, шаблонно мыслю :)]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td align="left">
<div>
<p>Я страсть как люблю хакерские программки, которые удивляют самим фактом своего существования.</p>
<p>Одна из таких: <a href="http://uuner.livejournal.com/55238.html">тетрис на sed&#8217;е</a>. Это что-то невероятное!</p>
<p>p.s. да, и я тоже, оказывается, шаблонно мыслю :)</p>
</div>
</td>
<td align="right"><img src="http://alexey.sveshnikov.ru/blog/wp-content/uploads/2008/06/anim.gif" alt="" title="sed tetris" width="255" height="255" class="alignright size-full" /></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2008/06/06/hackers-sed-tetris/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Пятничная загогулина (bash)</title>
		<link>http://alexey.sveshnikov.ru/blog/2008/04/11/zagogulina-bash-read/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2008/04/11/zagogulina-bash-read/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 09:41:07 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[загогулины]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[загогулина]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2008/04/11/%d0%b7%d0%b0%d0%b3%d0%be%d0%b3%d1%83%d0%bb%d0%b8%d0%bd%d0%b0-%d0%bd%d0%b0-bash/</guid>
		<description><![CDATA[Ну вот, пришло время для очередной программерской загогулины. Следующий код работать не будет: #!/usr/bin/bash echo "one two three" &#124; read a b c echo " " Что в нем не так? Я ожидаю увидеть два ответа. Первый &#8212; это просто переписать этот код так, чтобы он заработал. И второй ответ &#8212; опционально &#8212; объяснение, почему [...]]]></description>
			<content:encoded><![CDATA[<p>Ну вот, пришло время для очередной программерской загогулины. Следующий код работать не будет:</p>
<p><code>#!/usr/bin/bash<br />
echo "one two three" | read a b c<br />
echo "<$a> <$b> <$c>"</code></p>
<p>Что в нем не так?</p>
<p>Я ожидаю увидеть два ответа. Первый &#8212; это просто переписать этот код так, чтобы он заработал. И второй ответ &#8212; опционально &#8212; объяснение, почему не работает в таком виде.</p>
<p>p.s. второго ответа я пока сам не знаю, поэтому буду с интересом ждать его от вас :)<br />
p.p.s. ответивший верно, как всегда &#8211; умничка (-ца (маловероятно)).</p>
<p><b>UPD:</b> На второй вопрос ответ уже есть:<br />
<quote>gds<br />
есть мнение, что переменные, прочитанные read, остаются в переменных “экземпляра” баша, запущенного для выполнения “read a b c”, и не попадают в родительский баш, запустивший “echo … | read a b c”.</quote></p>
<p>gds&#8217;у &#8211; респект!<br />
А я понял, что в следующий раз надо постить задачки посложнее.. </p>
<p><b>UPD2</b> <s>свое решение выложу сегодня в конце рабочего дня</s><br />
<b>UPD3</b> </p>
<p>Кажется, я нечаянно сорвал рабочий день моего <a href="http://curved-hands.blogspot.com">начальника</a>, но зато он мне прислал вот такое остроумное решение:<br />
<code>str=`echo "one two three" | (read a b c; echo "a=$a; b=$b; c=$c;") `<br />
eval "$str";<br />
echo "<$a> <$b> <$c>"</code></p>
<p>Петя, ты отжог :) </p>
<p>Но на самом деле все это можно сделать несколько проще &#8211; через &#8220;here doc&#8221;:<br />
<code>read a b c  <<<`echo "one two three"`<br />
echo "<$a> <$b> <$c>"</code></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2008/04/11/zagogulina-bash-read/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Заговор от битых кластеров (добавляем информацию для восстановления архивов с помощью par2)</title>
		<link>http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 22:08:11 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[dd_rescue]]></category>
		<category><![CDATA[par2]]></category>
		<category><![CDATA[parchive]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2008/04/10/%d0%b7%d0%b0%d0%b3%d0%be%d0%b2%d0%be%d1%80-%d0%be%d1%82-%d0%b1%d0%b8%d1%82%d1%8b%d1%85-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc/</guid>
		<description><![CDATA[В этой заметке я предложу способ чтения данных с поцарапанных, погрызанных собакой или обработанных шредером компакт-дисков. Итак, к делу: регулярно, при записывании данных на диск, остается некоторое количество свободного места. Лет 5 назад можно было положить диск на полочку, пометив, что еще 30 мегабайт можно забить каким-нибудь хламом, но сейчас стоимость болванки &#8211; 10 рублей, [...]]]></description>
			<content:encoded><![CDATA[<p>В этой заметке я предложу способ чтения данных с поцарапанных, погрызанных собакой или обработанных шредером компакт-дисков. </p>
<p>Итак, к делу: регулярно, при записывании данных на диск, остается некоторое количество свободного места. Лет 5 назад можно было положить диск на полочку, пометив, что еще 30 мегабайт можно забить каким-нибудь хламом, но сейчас стоимость болванки &#8211; 10 рублей, такой аргумент не действует. И, соответственно, привычку оставлять место &#8220;на потом&#8221; надо искоренять. Мне кажется, наиболее разумным было бы добавить на диск данные для восстановления &#8211; т.н. корректирующие коды Рида-Соломона, которые могут пригодится в случае, если диск будет поврежден.</p>
<p>Собственно весь заговор выглядит следующим образом:<br />
<code>#sudo aptitude install par2<br />
#man par2<br />
#cd backups<br />
#ls<br />
dump.sql.gz<br />
#par2 create -v -r10 -n1 -m500 dump.sql.gz<br />
#ls<br />
dump.sql.gz  dump.sql.gz.par2  dump.sql.gz.vol000+100.par2</code></p>
<p>Эта команда добавит 10% избыточной информации к данным, запишет все это в один файл, при этом программе par2 разрешено использовать 500 мегабайт оперативной памяти. Файлы *.par2 следует записать на диск вместе с дампом. </p>
<p>Мне эта программа понравилась, я захотел ее проверить в боевых условиях. Сделал архив размером около 400 Мб, добавил данные для восстановления &#8211;  еще 200Мб &#8211; *.par2 файлы (50% избыточность, по умолчанию &#8211; 5%). Все это я записал на CD-RW, в котором потом сделал, простите, дырку. В итоге стандартными средствами удавалось прочитать только первые 150 Кб данных. Чтобы восстановить файл нужно сначала все считать пускай с ошибками &#8211; для этого есть программа dd_rescue, которая является практчески полным аналогом dd с одним исключением &#8211; она умеет игнорировать ошибки чтения:</p>
<p><img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2008/04/dsc_0001_1.jpg' alt='диск с дыркой' align="right" width="240"/></p>
<p><code>#sudo dd_rescue -Av -b 1048576 -B 1048576 /dev/scd0 brokencd.iso</code>(-A &#8211; заполняь нулями те участки файла, которые считать не удалось, v &#8211; verbose, -b &#8211; размер блока данных, -B &#8211; размер блока данных для проблемных областей диска)<br />
<code># sudo mount -o loop brokencd.iso mnt # монтируем получившийся образ диска<br />
# cp mnt/* dump; cd dump # копируем содержимое<br />
# par2 r archive.par2 # приводим в изначальный вид</code></p>
<p>На этом эксперимент завершился &#8211; все данные с диска восстановлены. Даже скучно.<br />
Но пример, мне кажется, весьма красноречив :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>О прозрачности в командной строке [pv]</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/12/04/%d0%be-%d0%bf%d1%80%d0%be%d0%b7%d1%80%d0%b0%d1%87%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b2-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%be%d0%b9-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b5-pv/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/12/04/%d0%be-%d0%bf%d1%80%d0%be%d0%b7%d1%80%d0%b0%d1%87%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b2-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%be%d0%b9-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b5-pv/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 21:01:55 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[pv]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2007/12/04/%d0%be-%d0%bf%d1%80%d0%be%d0%b7%d1%80%d0%b0%d1%87%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b2-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%be%d0%b9-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b5-pv/</guid>
		<description><![CDATA[Эта запись будет посвящена программе с лаконичным названием pv. А слово &#8220;прозрачность&#8221; пусть не ассоциируется у вас с пресловутыми compiz-fusion, тут все гораздо интереснее :) Итак, чем плох избитый пример c передачей файлов через netcat? Мне, например, не удобно то, что нет возможности наблюдать за процессом. В самом деле, возможности юниксовых шеллов в этом плане [...]]]></description>
			<content:encoded><![CDATA[<p>Эта запись будет посвящена программе с лаконичным названием pv. А слово &#8220;прозрачность&#8221; пусть не ассоциируется у вас с пресловутыми compiz-fusion, тут все гораздо интереснее :)</p>
<p>Итак, чем плох избитый пример c передачей файлов через netcat? Мне, например, не удобно то, что нет возможности наблюдать за процессом. В самом деле, возможности юниксовых шеллов в этом плане довольно скромные: с помощью tee можно сохранить поток в файл, который потом наблюдать через tail или следить за его размером командой &#8216;watch ls&#8217;. Этого достаточно для отладки, но мало для комфортной работы. </p>
<p>Поэтому программа pv просто не могла не появиться. Все очень в духе UNIX &#8211; маленькая утилитка, которая пропускает через себя поток данных и в STDERR отправляет некоторую статистику по ним. Но _как_ она это делает! Покажу на примерах:</p>
<p>Всегда хотел узнать:<br />
<code>dainichi@fujitsu:~$ cat /dev/toilet_paper | pv >/dev/shreder<br />
1.01GB 0:00:02 [ 569MB/s] [  <=>                                                                      ]</code><br />
Ага, больше десяти рулонов в секунду.. </p>
<p>Прикинемся взрослой программой с выводом а-ля wget:<br />
<code>dainichi@fujitsu:~$ cat file | pv -s `stat -c %s file` | nc so.far.away 1234<br />
 236kB 0:00:05 [ 346КB/s] [==================>                                                             ] 72%</code></p>
<p>Ограничим скорость обработки файла, чтобы mplayer не тормозил:<br />
<code>dainichi@fujitsu:~$ cat big_log | pv -L 100к | log_processor > report</code></p>
<p>Пример из мана &#8211; архивирование каталога и одновременное отображение прогрессбара<br />
<code>  (tar cf - . | pv -n -s `du -sb . | awk '{print $1}'` \<br />
     | gzip -9 > out.tgz) 2>&#038;1 | dialog --gauge 'Progress' 7 70</code></p>
<p>И, напоследок, скриншот с <a href="http://www.ivarch.com/programs/pv.shtml">домашней страницы</a> проекта:<br />
<img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2007/12/pv.png' alt='скриншот с домашней странички проекта pv' /></p>
<p>Здорово? :) По-моему, да :) </p>
<p>Кстати. а какие еще способы &#8220;очеловечить&#8221; интерфейс командной строки вы знаете?</p>
<p><b>UPD</b> <a href="http://libc6.blogspot.com/">Андрей Афанасенко</a> поделился ссылкой вот на такое <a href="http://www.theiling.de/projects/bar.html">чудо</a>:<br />
<img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2007/12/bar-cat-n.gif' alt='' /><br />
Написана эта программа на bash и во многих случаях ее использовать гораздо удобнее, чем pv.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/12/04/%d0%be-%d0%bf%d1%80%d0%be%d0%b7%d1%80%d0%b0%d1%87%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b2-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%be%d0%b9-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b5-pv/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
