<?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>Юникс и другие &#187; shell</title>
	<atom:link href="http://boombick.org/blog/posts/category/shell/feed" rel="self" type="application/rss+xml" />
	<link>http://boombick.org/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 29 Nov 2011 22:14:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Консольные хитрости #2</title>
		<link>http://boombick.org/blog/posts/98</link>
		<comments>http://boombick.org/blog/posts/98#comments</comments>
		<pubDate>Mon, 24 May 2010 15:33:22 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/98</guid>
		<description><![CDATA[Продолжаем публикацию &#8220;однострочников&#8221; для bash, которые выполняют полезные и интересные действия :) Список установленных расширений для Firefox grep -hIr -m 1 em:name ~/.mozilla/firefox/*.default/extensions&#124;sed 's#\s*##'&#124;tr '=' '"""'&#124;cut -f3 -d'"'&#124;sort -u Список установленных расширений для Chromium (с адресом страницы) for i in $(find ~/.config/chromium/*/Extensions -name 'manifest.json'); do n=$(grep -hIr name $i&#124; cut -f4 -d '"'&#124; sort);u="https://chrome.google.com/extensions/detail/";ue=$(basename $(dirname [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаем публикацию &#8220;однострочников&#8221; для bash, которые выполняют полезные и интересные действия :)<br />
<span id="more-98"></span><br />
Список установленных расширений для Firefox</p>
<blockquote><pre>
grep -hIr -m 1 em:name ~/.mozilla/firefox/*.default/extensions|sed 's#\s*##'|tr '<>=' '"""'|cut -f3 -d'"'|sort -u
</pre>
</blockquote>
<p>Список установленных расширений для Chromium (с адресом страницы)</p>
<blockquote><pre>
for i in $(find ~/.config/chromium/*/Extensions -name 'manifest.json'); do n=$(grep -hIr name $i| cut -f4 -d '"'| sort);u="https://chrome.google.com/extensions/detail/";ue=$(basename $(dirname $(dirname $i))); echo -e "$n:\n$u$ue\n" ; done
</pre>
</blockquote>
<p>Уровень сигнала wifi</p>
<blockquote><pre>
/sbin/iwconfig wlan0 | grep Quality | cut -d = -f2 | awk '{print $1}'
</pre>
</blockquote>
<p>Оптимизация sqlite-баз, в которых Firefox хранит всякую служебную информацию. Позволяет немного ускорить его работу</p>
<blockquote><pre>
find ~/.mozilla/firefox -name '*.sqlite' -print -exec sqlite3 {} "VACUUM; REINDEX;" \;
</pre>
</blockquote>
<p>Количество процессов для пользователя (Linux only)</p>
<blockquote><pre>
pgrep -cu boombick
</pre>
</blockquote>
<p>Сравнить вывод двух команд</p>
<blockquote><pre>
diff <(tail -10 file1) <(tail -10 file2)
</pre>
</blockquote>
<p>Удалить все файлы, кроме одного :) Часто пригождается, чтобы не писать rm тут_куча-имен-файлов</p>
<blockquote><pre>
ls -Q | grep -v "not-for-delete-file" | xargs rm -r
</pre>
</blockquote>
<p>Собрать несколько тарболлов в один</p>
<blockquote><pre>
cat 1.tar.gz 2.tar.gz | tar zxvif -
</pre>
</blockquote>
<p>Размер окна терминала</p>
<blockquote><pre>
 echo $COLUMNS x $LINES
</pre>
</blockquote>
<p>Вывести man-страницу как обычный текст. Удобно для распечатки</p>
<blockquote><pre>
man need-man | col -bx
</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/98/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ловушки bash</title>
		<link>http://boombick.org/blog/posts/94</link>
		<comments>http://boombick.org/blog/posts/94#comments</comments>
		<pubDate>Thu, 29 Apr 2010 18:24:33 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/94</guid>
		<description><![CDATA[Программирование на shell в общем и на bash в частности богато своими нюансами, которые, зачастую, упускаются из вида. В результате мы имеем проблемы на очевидных, вообщем-то, операциях. И как результат, зачастую, бывает &#8220;а ну его, этот баш! Перепишу на php/perl/python/ruby/etc&#8221; Эта статья написана для обсуждения и путей решения нескольких самых часто встречающихся &#8220;камней преткновения&#8221; при [...]]]></description>
			<content:encoded><![CDATA[<p>Программирование на shell в общем и на bash в частности богато своими нюансами, которые, зачастую, упускаются из вида. В результате мы имеем проблемы на очевидных, вообщем-то, операциях. И как результат, зачастую, бывает &#8220;а ну его, этот баш! Перепишу на php/perl/python/ruby/etc&#8221;<br />
Эта статья написана для обсуждения и путей решения нескольких самых часто встречающихся &#8220;камней преткновения&#8221; при программировании на bash. Я лично очень полюбил программировать на bash в последнее время и хочу поделиться кусочком знаний с вами :)<br />
<span id="more-94"></span><br />
<strong>1. for i in `ls *.mp3`</strong><br />
Знакомо? :) Если в имени файла встретится пробел, то все ваши усилия будут напрасны. Каждая из составляющих имени попадет в отдельную итерацию.</p>
<blockquote>
<pre>
 for i in `ls *.mp3`; do # Неверно!
    some command $i      # Неверно!
 done</pre>
</blockquote>
<p>Не получится и &#8220;закавычить&#8221; вывод <code>ls</code></p>
<blockquote>
<pre>
 for i in "`ls *.mp3`"; do # Неверно!
 ...</pre>
</blockquote>
<p>В этом случае ВЕСЬ вывод ls будет рассматриваться в контексте одной итерации. Это немного не то, чего хотелось бы добиться :) Решение есть</p>
<blockquote>
<pre>
for i in *.mp3; do  # Надо делать вот так и...
   some command "$i" # ...во втором пункте мы рассмотрим и это "узкое" место.
 done</pre>
</blockquote>
<p><strong>2. cp $file $target</strong><br />
Если в <code>$file</code> или <code>$target</code> окажутся пробелы, то вас ждет разочарование :)<br />
Выход не менее очевиден</p>
<blockquote>
<pre>
 cp "$file" "$target"</pre>
</blockquote>
<p><strong>3. Имена файлов, начинающиеся с дефисов</strong><br />
Всем известно, что параметры многих команд начинаются с дефиса <code>-</code>. В том случае, если с дефиса начинается имя файла, то оно будет ошибочно воспринято как параметр и вы получите ошибку. В лучшем случае.<br />
Одно из решений &#8211; поместить перед именами передаваемых фалов два дефиса <code>--</code>. Это сигнализирует команде (например <code>cp</code>) о том, что список параметров закончен и дальше идут аргументы:</p>
<blockquote>
<pre>
 cp -- "$file" "$target"</pre>
</blockquote>
<p>Но более элегантным решением, все-таки, будет цикл (причем с указанием каталога в пути к файлу):</p>
<blockquote>
<pre>
 for i in ./*.mp3; do
   cp "$i" /target
   ...</pre>
</blockquote>
<p>В этом случае аргумент, начинающийся с дефиса, будет передан как <code>./-foo.mp3</code> и все сработает нормально.</p>
<p><strong>4. [ $foo = "bar" ]</strong><br />
В bash вам необходимо заботиться о своих переменных. Иначе получите кучу ошибок :) Пример из заголовка выдаст ошибку в двух случаях:</p>
<ul>
<li>Если переменная, переданная в <code>[</code> не объявлена или пустая, то команда <code>[</code> "увидит" выражение<br />
<blockquote>
<pre>[ $foo = "bar" ]</pre>
</blockquote>
<p>как</p>
<blockquote>
<pre>[ = "bar" ]</pre>
</blockquote>
<p>и вы получите ошибку <em>unary operator expected</em> (ожидается унарный оператор). Так как оператор <code>=</code> бинарный, то <code>[</code> будет несколько шокирована :)</li>
<li>Если в <code>$foo</code> содержаться пробелы, то сравнение также будет некорректным<br />
<blockquote>
<pre>[ multiple words here = "bar" ]</pre>
</blockquote>
<p>И если вам это может показаться нормальным, то для <code>[</code> это довольно неожиданно :)</li>
</ul>
<p>Более корректно будет записать выражение как</p>
<blockquote>
<pre> [ "$foo" = bar ] # Все отлично</pre>
</blockquote>
<p>но, опять-таки, выполучите ошибку, если текст в переменной начинается с <code>-</code><br />
В bash есть ключевое слово <code>[[</code>, которое является расширением старой команды <code>test</code>, также известной как <code>[</code> и это решение всех подобных проблем :)</p>
<blockquote>
<pre>[[ $foo = bar ]] # Правильно</pre>
</blockquote>
<p>В случае с использованием <code>[[ ]]</code> вам не надо заключать переменную в кавычки, так как эта конструкция корректно обрабатывает и пустые переменные, и переменные, содержащие пробелы, и переменные, значение которых начинается с дефиса.<br />
Также вам может встретиться вот такой вариант:</p>
<blockquote>
<pre>[ x"$foo" = xbar ]</pre>
</blockquote>
<p><code>x"$foo"</code> - это хак для старых версий шелла, в которых вы вынуждены использовать <code>[</code>. И чтобы позаботиться о значении переменных, наичнающихся с дефиса, то можно использовать вот такую конструкцию.</p>
<p>А если одна из сторон сравниваемого выражения константа, то просто поместите переменную в правую часть :) <code>[</code> не обращает внимания на то, что находится справа</p>
<blockquote>
<pre>[ bar = "$foo" ]</pre>
</blockquote>
<p>Только левая часть выражения требует вашего особого внимания, на случай значения, начинающегося с дефиса.</p>
<p>Продолжение следует :)</p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/94/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PROMPT в стиле MS-DOS</title>
		<link>http://boombick.org/blog/posts/91</link>
		<comments>http://boombick.org/blog/posts/91#comments</comments>
		<pubDate>Mon, 29 Mar 2010 17:49:57 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/91</guid>
		<description><![CDATA[Наткнулся на забавную фишку :) Делаем следующее export PS1="C:\$( pwd &#124; sed 's:/:\\\\\:g' )> " и ностальгируем по временам MS-DOS :) Если очень понравилось, то можно добавить в ~/.bashrc следующий код: PS1="C:\$( pwd &#124; sed 's:/:\\\\\:g' )> " и наслаждаться красотой постоянно :)]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на забавную фишку :) Делаем следующее</p>
<blockquote><pre>export PS1="C:\$( pwd | sed 's:/:\\\\\:g' )> "</pre>
</blockquote>
<p>и ностальгируем по временам MS-DOS :)</p>
<p><a href='http://boombick.org/blog/wp-content/uploads/2010/03/screen.png' title='PROMPT в стиле MS-DOS'><img src='http://boombick.org/blog/wp-content/uploads/2010/03/screen.thumbnail.png' alt='PROMPT в стиле MS-DOS' /></a></p>
<p>Если очень понравилось, то можно добавить в <code>~/.bashrc</code> следующий код:</p>
<blockquote><pre>
PS1="C:\$( pwd | sed 's:/:\\\\\:g' )> "
</pre>
</blockquote>
<p>и наслаждаться красотой постоянно :)</p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/91/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Консольные хитрости</title>
		<link>http://boombick.org/blog/posts/90</link>
		<comments>http://boombick.org/blog/posts/90#comments</comments>
		<pubDate>Sun, 28 Feb 2010 08:18:35 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/90</guid>
		<description><![CDATA[Опытные юниксоиды знают и осознают всю мощь использования командной строки и немного &#8220;свысока&#8221; посматривают на &#8220;мышевозов&#8221; :) Но и в консоли есть свои недостатки, которые побеждаются с помощью каких-то приемов. У каждого свой набор, а я хочу поделиться своими наработками-находками-привычками, которые появились за долгие годы использования командной строки. Эдакий небольшой cheat-sheet. Начнем :) 1. Копирование [...]]]></description>
			<content:encoded><![CDATA[<p>Опытные юниксоиды знают и осознают всю мощь использования командной строки и немного &#8220;свысока&#8221; посматривают на &#8220;мышевозов&#8221; :) Но и в консоли есть свои недостатки, которые побеждаются с помощью каких-то приемов. У каждого свой набор, а я хочу поделиться своими наработками-находками-привычками, которые появились за долгие годы использования командной строки. Эдакий небольшой cheat-sheet.<br />
Начнем :)</p>
<p>1. Копирование файлов с указанием прогресса. Всегда чертовски не хватало информативности в <code>cp</code></p>
<blockquote>
<pre>
rsync --progress file1 file2</pre>
</blockquote>
<p><span id="more-90"></span></p>
<p>2. Преобразование текста в картинку. Использовал для создания простенькой капчи</p>
<blockquote>
<pre>
echo -e "Some Text Line1\nSome Text Line 2" | convert -background none -density 196  -resample 72 -unsharp 0x.5 -font "Courier" text:- -trim +repage -bordercolor white -border 3  text.gif</pre>
</blockquote>
<p>3. Поиск и замена в текстовых файлах</p>
<blockquote>
<pre>
find . -iname "FILENAME" -exec sed -i 's/SEARCH_STRING/REPLACE_STRING/g' {} \;</pre>
</blockquote>
<p>4. Метод Столлмана! Отправка веб-странички по почте :)</p>
<blockquote>
<pre>
{ u="http://twitter.com/boombick"; echo "Subject: $u"; echo "Mime-Version: 1.0"; echo -e "Content-Type: text/html; charset=utf-8\n\n"; curl $u ; } | sendmail recipient@example.com</pre>
</blockquote>
<p>5. Запись iso-файла на диск</p>
<blockquote>
<pre>
cdrecord -v speed=4 driveropts=burnfree dev=/dev/scd0 cd.iso</pre>
</blockquote>
<p>6. Ограничение канала для scp. В данном случае ограничен 10kbps</p>
<blockquote>
<pre>
scp -l10 boombick@srv02:/home/svnstat/* .</pre>
</blockquote>
<p>7. Скриншот на удаленной машине :) (С запущенными иксами конечно)</p>
<blockquote>
<pre>
DISPLAY=":0.0" import -window root screenshot.png</pre>
</blockquote>
<p>8. Качаем и сразу распаковываем :)</p>
<blockquote>
<pre>
wget -qO - http://example.com/path/to/blah.tar.gz | tar xzf -</pre>
</blockquote>
<p>9. url_encode :) Достаточно примитивно, но часто помогает</p>
<blockquote>
<pre>
echo "$url" | sed 's/%/%25/g;s/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&amp;/%26/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g'</pre>
</blockquote>
<p>10. Погода в Москве :) Подставьте свой город</p>
<blockquote>
<pre>
curl -s "http://www.google.com/ig/api?weather=Moscow" | sed 's|.*&lt;temp_c data="\([^"]*\)"/&gt;.*|\1|'</pre>
</blockquote>
<p>Пока все, to be continued</p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/90/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	<img style='margin:0;padding:0;border:0;' width='1px' height='1px' src="http://boombick.org/blog/wp-content/plugins/mystat/mystat.php?act=time_load&id=0&rnd=607327352" /></channel>
</rss>

