<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>shell-script &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/shell-script/</link>
	<description>Feed of posts on WordPress.com tagged "shell-script"</description>
	<pubDate>Wed, 25 Nov 2009 13:28:25 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[remove-temps - Refactoring script para apagar arquivos temporários]]></title>
<link>http://hugomaia.wordpress.com/2009/11/25/remove-temps-refactoring-script-para-apagar-arquivos-temporarios/</link>
<pubDate>Wed, 25 Nov 2009 13:17:43 +0000</pubDate>
<dc:creator>hugomaia</dc:creator>
<guid>http://hugomaia.wordpress.com/2009/11/25/remove-temps-refactoring-script-para-apagar-arquivos-temporarios/</guid>
<description><![CDATA[Adicionei no projeto Refactoring-scripts um novo script: o remove-temps. Ele apenas busca recursivam]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Adicionei no <a href="http://github.com/hugomaia/Refactoring-scripts">projeto Refactoring-scripts</a> um novo script: o remove-temps. Ele apenas busca recursivamente em um diretório por arquivos temporários e os elimina. Como é útil rodar antes de comitar, adicionei a opção -g, ou &#8211;git, que executa o comando &#8220;git rm&#8221; para todos os arquivos temporários, sendo que para utilizar esta opção, deve-se estar na diretório root do projeto e os arquivos ainda devem existir.</p>
<p>[]&#8217;s</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[afterFormat - script pós formatação para Ubuntu Karmic Koala]]></title>
<link>http://hugomaia.wordpress.com/2009/11/23/afterformat-script-pos-formatacao-para-ubuntu-karmic-koala/</link>
<pubDate>Mon, 23 Nov 2009 21:26:40 +0000</pubDate>
<dc:creator>hugomaia</dc:creator>
<guid>http://hugomaia.wordpress.com/2009/11/23/afterformat-script-pos-formatacao-para-ubuntu-karmic-koala/</guid>
<description><![CDATA[Em mais um episódio da série &#8220;Universidade pública: se você quer alguma coisa feita, não esper]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Em mais um episódio da série &#8220;Universidade pública: se você quer alguma coisa feita, não espere o servidor público morcego, faça você mesmo&#8221;, alguns amigos e eu tivemos que formatar os PC&#8217;s das bancadas de aula. Como em nossas bancadas utilizamos Linux, mais precisamente o Ubuntu, fiz um script em shell para automatizar o processo de configuração das máquinas e instalação dos softwares necessários.<br />
Como também tenho que formatar minha máquina e alguns amigos disseram que também irão formatar as suas, e todos iremos instalar o Ubuntu Karmic Koala, fiz uma adaptação do script das bancadas para uma versão que baixe tudo da Internet, instalando automaticamente diversos softwares básicos que sempre são necessários após uma formatação.<br />
Criei um <a href="http://github.com/hugomaia/afterFormat">projeto no github</a> para o script afterFormat.sh. Na imagem abaixo está a interface dos script na qual você pode escolher o que quer instalar ou não.</p>
<div align="center"><img src="http://github.com/hugomaia/afterFormat/raw/master/screenshot.png" alt="screenshot" /></div>
<p>Dê uma olhada no README para mais informações sobre os softwares que afterFormat instala, como executá-lo e como fazer a configuração básica do StarDict.</p>
<p>[]&#8217;s</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Refactoring scripts em shell]]></title>
<link>http://hugomaia.wordpress.com/2009/11/15/refactoring-scripts-em-shell/</link>
<pubDate>Sun, 15 Nov 2009 18:25:32 +0000</pubDate>
<dc:creator>hugomaia</dc:creator>
<guid>http://hugomaia.wordpress.com/2009/11/15/refactoring-scripts-em-shell/</guid>
<description><![CDATA[Mês passado estava trabalhando em um sistema que estou desenvolvendo em Rails com amigos da faculdad]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Mês passado estava trabalhando em um sistema que estou desenvolvendo em <a href="http://rubyonrails.org/">Rails</a> com amigos da <a href="http://www.uenf.br">faculdade</a> quando um deles viu que tinha feito uma <a href="http://pt.wikipedia.org/wiki/Merda">merda</a>. Ele tinha criado um modelo &#8220;viagem&#8221; com o scaffolding mas esqueceu de colocar o plural correto no inflections. Assim o scaffolding criou vários arquivos que continham no nome as palavras &#8220;viagems&#8221; ou &#8220;Viagems&#8221; e vários arquivos que tinham em seu conteúdo essas mesmas palavras. Contudo ele já havia programado bastante coisa depois disso e ficaria ruim retornar ao commit anterior no git.<br />
Ele já ia alterar tudo manualmente quando falei: Calma aí! Vou criar um script para isso!<br />
Era uma boa oportunidade, já que estou aprendendo a programar em shell. Em pouco tempo criei dois scripts básicos: um para modificar os nomes dos arquivos e outro para modificar o conteúdo. Logo pensei em montar um conjunto de scripts para refactoring já que uso o combo Gedit + Terminal para programar. Daí essa semana comecei a ler o livro <a href="http://www.shellscript.com.br/">Shell Script Professional</a> do <a href="http://aurelio.net/">Aurélio Marinho</a>, que é muito bom livro por sinal, e dei uma profissionalizada nos scripts para colocar em prática meus aprendizados.<br />
O resultado está no projeto <a href="http://github.com/hugomaia/Refactoring-scripts">Refactoring-scripts</a> github. Por enquanto são dois:</p>
<p>- find-replace.sh &#8211; Busca em um arquivo, ou recursivamente em todos os arquivos de um diretório, por uma palavra e a substitui por outra.</p>
<p>- change-file-name.sh &#8211; Busca recursivamente em um diretório por arquivos que contenham uma palavra em seu nome e a substitui por outra.</p>
<p>A pretensão é, além criar outros scripts, cirar um fork para um plugin de refactoring em python para o gedit.<br />
Mas isso é coisa para as férias de fim de ano. =)</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[defaults system 사용법]]></title>
<link>http://jongampark.wordpress.com/2009/11/15/defaults-system-%ec%82%ac%ec%9a%a9%eb%b2%95/</link>
<pubDate>Sun, 15 Nov 2009 08:15:50 +0000</pubDate>
<dc:creator>jongampark</dc:creator>
<guid>http://jongampark.wordpress.com/2009/11/15/defaults-system-%ec%82%ac%ec%9a%a9%eb%b2%95/</guid>
<description><![CDATA[login item에 항목을 추가하는 인스톨러를 만들기 위해 참 많은 시간을 허비했다. PakcageMaker의 안정적이지 않은 동작으로 애를 먹었었고, 사실 최근 버젼들은 비교적]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>login item에 항목을 추가하는 인스톨러를 만들기 위해 참 많은 시간을 허비했다.<br />
PakcageMaker의 안정적이지 않은 동작으로 애를 먹었었고, 사실 최근 버젼들은 비교적 안정적이었다. 하지만 역시 이해하기 힘든 부분이 있었고, 또한 무슨 일이 왜 발생하는지 인스톨 로그를 보고선 파악하기 힘든 면이 있었다. 이에 대해서 별도로 포스팅을 하겠는데, 그전에 defaults system에 대해서 언급을 해야겠다.<br />
Windows에는 registry란 것이 있다. 여기에 어떤 프로그램을 인스톨했으며, 그 프로그램에서 어떤 세팅을 어떻게 했으며 등등을 기록해 놓는 것이다. 이 registry는 Windows를 쓰면 쓸수록 성능이 떨어지게 만드는 주범 중의 하나이기도 하다. 이런 이유에는 registry를 사용하는 Windows 자체의 문제이기도 하지만, InstallShield나 MSI installer setup project를 만드는게 참 어렵기 때문에, 인스톨 프로그램을 만드는 사람들이 제대로 모든 도큐먼트를 충분히 이해하고 만들지 못하는 이유가 있기도 하다.</p>
<p>Mac은 비교적 깔끔하게 이런 관리를 한다. registry란 단일의 공간이 있다기 보다는 preference를 /Library/Preference나 ~/Library/Preference에 각 프로그램 별로 저장을 한다. com.apple.Safari.plist와 같은 것이 바로 그것이다. 산업계 표준에 맞추어서 그 이름도 com.apple.Safari처럼 해 놓았고, plist는 XML이라 그 내용을 보기도 편하다. 단 text XML이라 그 파일이 커지면 느려지고 커지는 단점도 있어서 요새는 Binary XML도 이용하는 추세이다.<br />
Windows에서처럼 registry란 단일 공간내에 기록될 필요가 없어서, 저장공간 (메모리건 하드디스크건)을 차지하는데 그 공간이 비대해질 염려도 적다. 그러므로 세팅을 찾는데 시간도 적게 걸린다. ( Windows Sys Internals 툴을 이용해보면 Windows가 수시로 registry를 업데이트하는데 시간을 많이 보내고 있음을 볼 수있다. Mac에선 적어도 이런 일은 최소화가 된다. 왜 Windows가 아무일도 안하고 가만히 있는 거 같은데도 수시로 HDD를 긁어대는지 그 이유는 이런데 있다. 물론 background process들도 계속 돌고 있고, 그들이 registry에 써대는 이유도 있지만, 기본적으로 Windows는 registry관리에 CPU time의 일정 부분을 줄기차게 할애한다. )</p>
<p>Mac에서는 각 프로그램들에서 세팅을 하면 그것이 이런 XML파일에 저장이 된다. 프로그램이 설치되서 실행이 되면, 그리고 뭔가 세팅을 저장하면 비로소 이 XML이 생기는데, 아쉽게도 프로그램을 지웠을때, 이 파일들이 자동으로 없어지진 않는다. 이렇게 남아도 Windows처럼 registry란 중앙 집중적인 공간에 저장되지 않기 때문에 퍼포먼스 하락에 그다지 일조하지 않는다. 하지만 Mac에는 다른 문제점이 있는데, 여기에 버그가 좀 있다. 바로 receipt DB란 것이다. 여기에 대해선 뒤에서 언급하기로 하고&#8230;</p>
<p>아무튼 세팅을 저장하기 위해선 해당 프로그램을 열어서 거기서 지원하는 preference&#8230; 메뉴를 이용해서 주로 바꾸게 되는데&#8230;<br />
해당 프로그램을 열지 않고서 바꾸려면 어떻게 해야 하는가? 바로 그 XML 파일들을 직접 열어서 바꿔주면 된다. 근데 이 부분은 user interaction이 들어가서, 때때로 shell script등에서 해주기엔 곤란한 부분이 있다. 이때 바로 쓰는게 defaults system이란 것이다. 종종 Mac OS X Hints와 같은 웹사이트에서 이것을 이용해서 hidden setting을 이용하는게 보인다. 특히 Shell programming을 많이 하게 될 Sys Admin들 입장에서는 defaults system을 아는게 상당히 중요하다.<br />
그러다보면 많이 보게 되는게 바로 MAN page인데.. 문제는 이 MAN page의 설명이 당췌 알아보기가 힘들게 되어 있다는 것이다. MAN page가 그렇듯이 항상 긴 설명에 예제는 거의 없다. 어떤 것을 정의 해 놓고서 그게 뭘 뜻하는 건지 설명이 없기 일쑤다.</p>
<p>자 한번 보자</p>
<pre>write domain key 'value'
  Writes value as the value for key in domain.
  value must be a property list, and must be enclosed
  in single quotes.
  For example:
     defaults write com.companyname.appname "Default Color" '(255, 0, 0)'
  sets the value for Default Color to an array containing the strings 255, 0, 0
  (the red, green, and blue components).
  Note that the key is enclosed in quotation marks because it contains a space.

write domain 'plist'
  Overwrites the defaults information in domain with that given as plist.
plist must be a property list representation of a dictionary,
and must be enclosed in single quotes.
  For example:
    defaults write com.companyname.appname '{ "Default Color" = (255, 0, 0); "Default Font" = Helvetica; }';
  erases any previous defaults for com.companyname.appname and writes the values for the two names into the defaults system.</pre>
<p>자 이 설명으로 key value 쌍으로 세팅할때는 어떻게 하는지, plist는 어떻게 생겼는지 알 수가 있다.</p>
<p>자 그럼 다음을 보자.</p>
<pre>-array      Allows the user to specify an array as the value for the
                given preference key:

                  defaults write somedomain preferenceKey -array element1 element2 element3

                 The specified array overwrites the value of the key if the
                 key was present at the time of the write. If the key was not
                 present, it is created with the new value.

-array-add  Allows the user to add new elements to the end of an array
                 for a key which has an array as its value. Usage is the same
                 as -array above. If the key was not present, it is created
                 with the specified array as its value.

-dict       Allows the user to add a dictionary to the defaults database
               for a domain.  Keys and values are specified in order:

                  defaults write somedomain preferenceKey -dict key1 value1 key2 value2

               The specified dictionary overwrites the value of the key if
               the key was present at the time of the write. If the key was
               not present, it is created with the new value.

-dict-add   Allows the user to add new key/value pairs to a dictionary
               for a key which has a dictionary as its value. Usage is the
               same as -dict above. If the key was not present, it is cre-
               ated with the specified dictionary as its value.</pre>
<p>저 array element가 어떻게 생겼는지 알 수가 없다. 또한 dictionary 경우엔 key과 value로 어떤 형태의 데이터를 받아들이는지 알기가 힘들다.<br />
도대체 element는 어떤 type의 것일까?</p>
<p>Login item을 넣기 위해서 구글에서 찾아보았다.<br />
근데 그다지 도움이 되지를 않았다. 대개 간단한 경우에 대해서만 했기 때문이다.<br />
그래서 고생 고생끝에 되는 형태를 찾았는데..</p>
<pre>#!/bin/sh
defaults write loginwindow AutoLaunchedApplicationDictionary -array-add '{"Hide" = "True"; "Path" = "/Applications/NEXIO Sync.app";}'
echo "Writing to defaults system is done"</pre>
<p>자.. 위의 것은 shell script 파일로 만든 것이다. 편하게 사용하려면 execution 권한을 저 파일에 주면 되는 것이고, 일일히 sh를 호출하기 싫어서 She-Bang라인을 넣어 주었다.<br />
음.. AutoLaunchedApplicationDictionary 아이템에 -array-add 이후의 아이템을 넣는 것인데, 그 자체가 dictionary 형태이다.<br />
즉 한 dictionay를 array로 넣는 것이다. 왜 그럼 -dict-add를 넣으면 안될까? 그건 AutoLaunchedApplcationDictionary의 형태 때문이다. 자 보자..</p>
<p><a href="http://jongampark.wordpress.com/files/2009/11/loginwindow-plist.png"><img class="aligncenter size-full wp-image-956" title="loginwindow-plist" src="http://jongampark.wordpress.com/files/2009/11/loginwindow-plist.png" alt="loginwindow-plist" width="510" height="345" /></a></p>
<p>자.. AuoLaunchedApplicaitonDictionary 키 자체가 여러 아이템을 가지고 있게 되는 형태고, 그 아이템마다 세팅이 있는 것이다.<br />
그러므로 각 아이템이 dictionary이니까, dictionary 자체를 array의 한 아이템으로 넣는 것이다.<br />
그러므로 만약 -dict-add를 이용하면 이미 있는 item1과 item 2가 없어지면서, 한 이이템들이 아닌 AutoLaunchedApplicaitonDictionary 자체의 property들로 key와 value가 세팅이 된다.</p>
<p>이렇게 알고 보면 참 간단한데, 전혀 설명이 없는 상태에서 MAN 페이지의 설명만 봐서는 알기가 힘들다. add 버젼과 아닌 버젼의 차이는, add가 있는 경우는 이미 기존에 있는 것들에 덧붙여서 넣는 것이고, 없는 것은 기존에 있던 것을 갈아치우는 것이다. 이것에 대한 설명은 다행이 있다.</p>
<p>암튼 이렇다.</p>
<p><strong><span style="color:#ff0000;">ADDED</span></strong> : 아.. sed에 익숙한 분이시면 sed를 이용하시는 것도 한 방법이 되겠다.<br />
근데 text processing이 귀찮으니까, 그냥 defautls system을 이용하시는게..<br />
<a href="http://forums.macosxhints.com/showthread.php?t=61034">sed를 이용해서 plist파일을 바꾸는 것이 여기에 포스팅</a> 되어 있으니 참고하시면 jump start를 하는데 도움이 될 듯..</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[printargs.c - utility for debugging quoted strings in shell scripts]]></title>
<link>http://h446log.wordpress.com/2009/11/12/printargs-c-utility-for-debugging-quoted-strings-in-shell-scripts/</link>
<pubDate>Thu, 12 Nov 2009 20:51:19 +0000</pubDate>
<dc:creator>h446log</dc:creator>
<guid>http://h446log.wordpress.com/2009/11/12/printargs-c-utility-for-debugging-quoted-strings-in-shell-scripts/</guid>
<description><![CDATA[Here&#8217;s a very simple utility program that I use to debug how the shell interpreter parses quot]]></description>
<content:encoded><![CDATA[Here&#8217;s a very simple utility program that I use to debug how the shell interpreter parses quot]]></content:encoded>
</item>
<item>
<title><![CDATA[10 Perintah Linux yang (Mungkin) Jarang Anda Pakai]]></title>
<link>http://northskh.wordpress.com/2009/11/10/10-perintah-linux-yang-mungkin-jarang-anda-pakai/</link>
<pubDate>Tue, 10 Nov 2009 03:53:25 +0000</pubDate>
<dc:creator>northskh</dc:creator>
<guid>http://northskh.wordpress.com/2009/11/10/10-perintah-linux-yang-mungkin-jarang-anda-pakai/</guid>
<description><![CDATA[1. Keluar dari Terminal dengan Cepat Anda dapat keluar dari terminal dengan cepat menggunakan CTRL+D]]></description>
<content:encoded><![CDATA[1. Keluar dari Terminal dengan Cepat Anda dapat keluar dari terminal dengan cepat menggunakan CTRL+D]]></content:encoded>
</item>
<item>
<title><![CDATA[Getting MC1 to run:  simulation sequences and run scripts]]></title>
<link>http://madscientistworkshop.wordpress.com/2009/11/09/getting-mc1-to-run-simulation-sequences-and-run-scripts/</link>
<pubDate>Mon, 09 Nov 2009 22:18:00 +0000</pubDate>
<dc:creator>rich gwozdz</dc:creator>
<guid>http://madscientistworkshop.wordpress.com/2009/11/09/getting-mc1-to-run-simulation-sequences-and-run-scripts/</guid>
<description><![CDATA[Two important things here: (1) Equalization and spin-up simulations need to be run prior to historic]]></description>
<content:encoded><![CDATA[Two important things here: (1) Equalization and spin-up simulations need to be run prior to historic]]></content:encoded>
</item>
<item>
<title><![CDATA[Shell Script – Perhitungan Aritmatik]]></title>
<link>http://joe8186.wordpress.com/2009/11/05/shell-script-%e2%80%93-perhitungan-aritmatik/</link>
<pubDate>Thu, 05 Nov 2009 02:26:48 +0000</pubDate>
<dc:creator>joe8186</dc:creator>
<guid>http://joe8186.wordpress.com/2009/11/05/shell-script-%e2%80%93-perhitungan-aritmatik/</guid>
<description><![CDATA[Untuk melakukan perhitungan aritmatik, shell tidak memiliki kemampuan built-in, tetapi meminta bantu]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><div>
<p>Untuk melakukan perhitungan aritmatik, shell tidak memiliki  kemampuan<br />
built-in, tetapi meminta bantuan program lain yaitu `expr`. Program  expr<br />
berfungsi untuk mengevaluasi suatu expresi baik itu perbandingan  string<br />
atau operasi aritmatik sederhana.</p>
<p>Operator aritmatik yang disediakan expr antaran  lain:<br />
+———–+———————————————————–+<br />
&#124; Operator &#124; KETERANGAN  &#124;<br />
+———–+———————————————————–+<br />
&#124; + &#124; Operator Penjumlahan contoh: expr 1 +  1 &#124;<br />
+———–+———————————————————–+<br />
&#124; – &#124; Operator Pengurangan contoh: expr 10  – 9 &#124;<br />
+———–+———————————————————–+<br />
&#124; * &#124; Operator Perkalian contoh: expr 10  \* 10 &#124;<br />
+———–+———————————————————–+<br />
&#124; / &#124; Operator Pembagian contoh: expr  10 / 2 &#124;<br />
+———–+———————————————————–+<br />
&#124; % &#124; Operator Modulus contoh: expr  15 % 3 &#124;<br />
+———–+———————————————————–+</p>
<p>Selain digunakan untuk perhitungan aritmatik, perintah `expr` juga  cukup<br />
handal untuk melakukan manipulasi string, untuk lebih jelas silahkan  lihat<br />
halaman manual dari expr dengan mengetikkan `man expr`.</p>
<p>contoh:<br />
Buatlah sebuah shell script untuk menghitung nilai dari argument-1  dikali<br />
argument-2 ditambah argument-3!</p>
<p>jawaban:<br />
Secara matematis perhitungannya adalah</p>
<p>(argument-1 + argument-2) + argument-3.</p>
<p>Tidak seperti bahasa tingkat tinggi, pada shell script untuk  memberi<br />
prioritas pada suatu perhitungan kita menggunakan tanda $[ ... ].  Jadi<br />
perhitungannya menjadi</p>
<p>$[ argument-1 + argument-3 ] + argument-3</p>
<p>Keuntungan lain ketika kita menggunakan tanda $[...] adalah kita tidak  perlu<br />
melakukan escaping character pada tanda perkalian(*). Berikut ini  adalah<br />
shell scriptnya.</p>
<p>bash-2.04$ vi hitung.sh<br />
#!/bin/sh</p>
<p>bil1=$1<br />
bil2=$2<br />
bil3=$3</p>
<p>echo -n “HASIL DARI $bil1 * $bil2 + $bil3 = ”<br />
echo `expr $[ $bil1 * $bil2  ] + $bil3`</p>
<p>bash-2.04$ chmod +x hitung.sh<br />
bash-2.04$ ./hitung.sh 10 10 10</p>
<p>HASIL DARI 10 * 10 + 10 = 110</p>
</div>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Shell Script – Variable ]]></title>
<link>http://joe8186.wordpress.com/2009/11/05/shell-script-%e2%80%93-variable/</link>
<pubDate>Thu, 05 Nov 2009 02:26:09 +0000</pubDate>
<dc:creator>joe8186</dc:creator>
<guid>http://joe8186.wordpress.com/2009/11/05/shell-script-%e2%80%93-variable/</guid>
<description><![CDATA[Pemberian variabel pada shell script bersifat ‘dynamic typing’ karena shell script tidak mengenal ad]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><div>
<p>Pemberian variabel pada shell script bersifat ‘dynamic typing’  karena<br />
shell script tidak mengenal adanya tipe data. Pada shell script  dikenal<br />
dua istilah variabel yaitu SYSTEM VARIABLE(SV) dan USER DEFINED  VARIABLE<br />
(UDV). SV adalah kumpulan variabel yang telah dideklarasikan secara  otomatis<br />
oleh shell, sedangkan UDV adalah variabel yang kita buat sendiri.  Contoh dari<br />
variabel SV adalah HOME, SHELL, RANDOM, OSTYPE, dan masih banyak  yang lain.</p>
<p>Dalam membuat variabel ada beberapa aturan yang harus dipenuhi agar  variabel<br />
tersebut dianggap valid oleh shell, syntax untuk penamaan variabel  adalah:</p>
<p>nama_variabel=NILAI</p>
<p>Perhatikan bahwa tidak ada spasi antara nama_variabel dengan tanda ‘=’  juga<br />
dengan NILAI. Ini adalah suatu KEHARUSAN. Berikut adalah beberapa  aturan<br />
tentang penamaan variabel:</p>
<p>1. Variabel HARUS diawali ABJAD atau _ (tidak dapat diawali angka)<br />
2.  Variabel dapat terdiri dari karakter alphanumeric dan _<br />
3. Variabel bersifat  CaSe SeNsItIvE<br />
4. Jika isi variabel mengandung spasi sebaiknya apit dengan  tanda petik (’)<br />
atau (”).<br />
5. Gunakan escape character (\) untuk karakter  non-literal<br />
seperti (\’, \$, \?, dll)</p>
<p>Untuk mencetak nilai dari suatu variabel digunakan tanda dollar ($)  didepan<br />
nama variabel, contoh:</p>
<p>bash-2.04$ a=’Hello ‘<br />
bash-2.04$ b=’World!’<br />
bash-2.04$ echo  $a$b<br />
Hello World!<br />
bash-2.04$ echo ${a}${b}<br />
Hello World!</p>
<p>Cara yang terakhir adalah cara yang disarankan untuk menghindari  kesalahan<br />
dalam melakukan concat string.</p>
<p>Jika anda ingin menyimpan output dari suatu perintah kedalam suatu  variabel<br />
gunakan tanda backtick (`). Contoh, kita akan melihat isi direktori  home<br />
lalu menyimpannya dalam variabel isi_home.</p>
<p>bash-2.04$ isi_home=`ls /home`<br />
bash-2.04$ echo $isi_home</p>
<p>Dalam shel juga terdapat SPECIAL VARIABEL untuk mendapatkan exit status  dari<br />
suatu program. Pada UNIX setiap program dinyatakan selesai TANPA  error<br />
apabila exit statusnya SAMA DENGAN 0. Selain itu maka program  tersebut<br />
selesai tapi dengan error. Variabel tersebut adalah “$?”.</p>
<p>bash-2.04$ ls /home<br />
bash-2.04$ echo $?<br />
0<br />
bash-2.04$ ls  /file/ngawur<br />
bash-2.04$ echo $?<br />
2</p>
<p>Angka 2(TIDAK SAMA DENGAN 0) menunjukkan bahwa program ls keluar  dengan<br />
status terjadi error. Penggunaan exit sangat penting saat kita  membuat<br />
shell script yang kompleks, dimana didalamnya kita banyak  menggunakan<br />
program lain.</p>
</div>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Apa itu shell script?! ]]></title>
<link>http://joe8186.wordpress.com/2009/11/05/apa-itu-shell-script/</link>
<pubDate>Thu, 05 Nov 2009 02:24:50 +0000</pubDate>
<dc:creator>joe8186</dc:creator>
<guid>http://joe8186.wordpress.com/2009/11/05/apa-itu-shell-script/</guid>
<description><![CDATA[Dalam lingkungan unix, kata ’shell’ mengacu pada semua program yang dapat dijalankan pada command li]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><div>
<p>Dalam lingkungan unix, kata ’shell’ mengacu pada semua program yang  dapat<br />
dijalankan pada command line. Jadi secara sederhana shell script  merupakan<br />
kumpulan perintah yang disimpan pada suatu file. Extensi umum yang  digunakan<br />
untuk shell script adalah ‘.sh’, sebenarnya hal ini tidak mutlak  karena<br />
pada dasarnya unix mengabaikan extensi file.</p>
<p>Shell juga dapat mengacu pada program yang menangani command line  itu<br />
sendiri dalam sistem operasi UNIX program tersebut adalah Bourne  Shell<br />
(1978 – Steve Bourne) disingkat sh. Dalam sistem operasi GNU/Linux  shell yang<br />
menjadi standar adalah Bourne Again Shell(bash). Bash merupakan  shell yang<br />
kompatibel dengan sh dan memiliki lebih banyak fitur.</p>
<p>Jika anda ingin menguasai shell script tentu anda harus tahu dan  hafal<br />
sedikit banyak perintah dasar command line, seperti mengkopi  file(cp),<br />
merename file(mv), mencetak string (echo), melihat file(cat), dan  beberapa<br />
perintah dasar lainnya.</p>
<p>Shell script juga menyediakan beberapa fitur yang tersedia pada  bahasa<br />
pemrograman tingkat tinggi seperti variabel, percabangan dan  perulangan.<br />
Berikut ini adalah contoh sederhana penggunakan shell script:</p>
<p>bash-2.04$ vi hello.sh<br />
#!/bin/sh<br />
echo ‘HELLO WORLD’</p>
<p>Untuk menjalankan ada dua cara, pertama melalui program shell itu sendiri</p>
<p>bash-2.04$ sh hello.sh</p>
<p>Kedua adalah mengeksekusinya secara independen, untuk melakukan hal  tersebut<br />
anda harus memberi permission ‘execute’ pada file.</p>
<p>bash-2.04$ chmod +x hello.sh<br />
bash-2.04$ ./hello.sh<br />
HELLO WORLD</p>
<p>Baris pertama #!/bin/sh adalah MUTLAK diperlukan dan HARUS diletakkan  pada<br />
BARIS PERTAMA agar file yang anda buat dikenali sistem sebagai shell  script.<br />
Tanda ‘#!’ sering disebut ’shebang’ operator. Tanda tersebut  menandakan<br />
bahwa file tersebut adalah shell script. Sisanya misal ‘/bin/sh’  adalah<br />
lokasi file binari atau program. Dalam contoh kita menggunakan  program<br />
bash ‘/bin/sh’ atau ‘/bin/bash’.</p>
<p>Tanda # jika tidak terletak pada baris dan kolom paling awal akan  dianggap<br />
sebagai komentar oleh shell.</p>
</div>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Perfect 9.10 Ubuntu Desktop from Shell Script]]></title>
<link>http://redshirtlinux.wordpress.com/2009/11/04/the-perfect-9-10-ubuntu-desktop-from-shell-script/</link>
<pubDate>Wed, 04 Nov 2009 01:27:12 +0000</pubDate>
<dc:creator>redshirtlinux</dc:creator>
<guid>http://redshirtlinux.wordpress.com/2009/11/04/the-perfect-9-10-ubuntu-desktop-from-shell-script/</guid>
<description><![CDATA[Hello All, I am currently working on crafting a shell script for the i386  platform and x64 platform]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello All,</p>
<p>I am currently working on crafting a shell script for the i386  platform and x64 platform.  This script will be modeled after Howtoforge&#8217;s <a href="http://www.howtoforge.com/the-perfect-desktop-ubuntu-9.10-karmic-koala">The Perfect Desktop &#8211; Ubuntu 9.10</a>.  I will include several extras to which I feel will make a more complete desktop package.  This scripts will be published by tomorrow (Nov 4th) after I have tested them within Virtual Machines to ensure that they function as designed.  My goal however is to allow a user to install Ubuntu and run my shell script with little effort, thus providing them with a desktop to suit their every need.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[[CC] If em 1 linha (shell script)]]></title>
<link>http://danielbauermann.wordpress.com/2009/11/03/cc-if-em-1-linha-shell-script/</link>
<pubDate>Tue, 03 Nov 2009 12:01:24 +0000</pubDate>
<dc:creator>Daniel Bauermann</dc:creator>
<guid>http://danielbauermann.wordpress.com/2009/11/03/cc-if-em-1-linha-shell-script/</guid>
<description><![CDATA[Embora comandos de 1 linha nem sempre germ clareza (e por isto os evito), hoje, especificamente, res]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Embora comandos de 1 linha nem sempre germ clareza (e por isto os evito), hoje, especificamente, resolvi empregar um &#8220;if&#8221; em uma linha para um caso em especial.</p>
<p>Como não tenho o costume de usá-los, não lembrava a sintaxe. Nada que o &#8220;pai Google&#8221; não resolva.</p>
<blockquote><p>Li este termo semana passada em algum <em>blog</em> e achei bastante original!</p></blockquote>
<p>Talvez este não seja o <a title="Post sobre &#34;ifs&#34; de 1 linha." href="http://codare.net/2006/10/03/shell-use-e-e-ou-ao-inves-de-ifthenfi/" target="_self"><em>link</em></a> mais específico para meu caso, mas foi o primeiro que encontrei e solucinou-me o problema. Além disto, o blog deste <em>link</em> tem material bastante interessante (e bons autores), que já utilizei em outros casos. Só por isto já vale a referência!</p>
<p>Mas esta seção é para ser simples, então chega de lero-lero e vamos ao comando (aproveitando o exemplo do <em>link</em> citado!):</p>
<pre>[ $var -ne 1 ] &#38;&#38; echo "Não é 1"
</pre>
<p>ou ainda:</p>
<pre>test -w $file &#124;&#124; echo "$file não é gravável"</pre>
<p>&#160;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Monitorar logins realizados via SSH]]></title>
<link>http://lucianoborguetti.wordpress.com/2009/11/01/monitorar-logins-realizados-via-ssh/</link>
<pubDate>Mon, 02 Nov 2009 01:21:37 +0000</pubDate>
<dc:creator>lucianoborguetti</dc:creator>
<guid>http://lucianoborguetti.wordpress.com/2009/11/01/monitorar-logins-realizados-via-ssh/</guid>
<description><![CDATA[Nessa artigo vou mostrar como monitorar os logins realizados via SSH de forma simples, usando soment]]></description>
<content:encoded><![CDATA[Nessa artigo vou mostrar como monitorar os logins realizados via SSH de forma simples, usando soment]]></content:encoded>
</item>
<item>
<title><![CDATA[Shell Script: Verificar conexão de rede, criar diretórios e mapear unidades de rede em seu Linux!]]></title>
<link>http://memphyx.wordpress.com/2009/10/30/shell-script-verificar-conexao-de-rede-criar-diretorios-e-mapear-unidades-de-rede-em-seu-linux/</link>
<pubDate>Fri, 30 Oct 2009 17:24:40 +0000</pubDate>
<dc:creator>memphyx</dc:creator>
<guid>http://memphyx.wordpress.com/2009/10/30/shell-script-verificar-conexao-de-rede-criar-diretorios-e-mapear-unidades-de-rede-em-seu-linux/</guid>
<description><![CDATA[Não tinha nada o que fazer e resolvi &#8220;tentar&#8221; adiantar meu próprio lado criando um peque]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Não tinha nada o que fazer e resolvi &#8220;tentar&#8221; adiantar meu próprio lado criando um pequeno shell script para conectar em um servidor em que, de vez em nunca, preciso restaurar ou copiar alguns arquivos de backups da rede ( &#8230; tipo naquelas&#8230; de uma vez por ano ou uma vez na vida e outra na morte&#8230; quando o chefe quer as &#8220;fotos da festa de mil novecentos e lá vai bolinha&#8221;&#8230; ) &#8230; sabe como é, existem momentos que ficamos &#8220;ociosos&#8221;!</p>
<p>Pois bem, o script é muito simples e pode ser útil para diversas outras opções além de &#8220;copiar&#8221; fotos para seu superior ou para aquela garota que sempre está &#8220;incomodando&#8221; o cara de T.I. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<h3>O ambiente é simples:</h3>
<p>Tenho um servidor <a title="Windows 2000 Server" href="http://pt.wikipedia.org/wiki/Windows_2000_server" target="_blank">Windows 2000 Server</a>, com algumas pastas compartilhadas no <a title="Active Directory" href="http://pt.wikipedia.org/wiki/Active_Directory" target="_blank">AD</a> (com restrições de acesso, leitura e escrita, onde cada usuário possui permissões diferentes: <em>login e senha</em>).</p>
<p>O endereço do servidor é <em>192.168.0.100</em>, e as pastas compartilhadas, digamos que sejam <strong><em>F</em></strong>, <strong><em>G</em></strong>, <strong><em>H</em></strong>, <strong><em>Informatica</em></strong>, <strong><em>X</em></strong> e <strong><em>Z</em></strong>.</p>
<p>Como não quero utilizar a interface gráfica para isto e quero utilizar um terminal, a &#8220;temida&#8221; linha de comando (<a title="Escovando bits no CLI" href="http://pt.wikipedia.org/wiki/Linha_de_comando" target="_blank">escovando bits no CLI</a>), a maneira mais chata, e a princípio, parecendo a mais rápida, seria fazer isto aqui:</p>
<blockquote><p><em>mkdir /media/W2KServer &#38;&#38; mkdir /media/W2kServer/F</em></p>
<p><em>mount -t cifs -o </em><em>username=jeferson,password=minhasenhasecreta</em><em>,gid=users,iocharset=utf8,rw,users,file_mode=0777,dir_mode=0777 //192.168.0.100/F /media/W2kServer/F</em></p></blockquote>
<p>Sinceramente, esta não é uma boa ideia, ainda mais que meu usuário e senha, ficaram gravados nos históricos de comandos do bash, e se eu levantar da mesa por um minuto, chegar alguém e ficar por um tempinho em minha sessão aberta, logo poderá ter tais dados muito facilmente.</p>
<p>Ainda bem e para minha própria segurança, posso usar a opção <strong>credentials</strong> e indicar um arquivo que contém meu usuário e senha, e nisto, não fica a senha a <em>Deus dará</em>&#8230; vejam:</p>
<blockquote><p><a title="mount -t cifs" href="http://www.cyberciti.biz/tips/how-to-mount-remote-windows-partition-windows-share-under-linux.html" target="_blank"><em>mount -t cifs</em></a><em> -o </em><strong><em>credentials=/root/.smb-credents</em></strong><em>,gid=users,iocharset=utf8,rw,users,file_mode=0777,dir_mode=0777 //192.168.0.100/F /media/W2kServer/F</em></p></blockquote>
<p>O &#8216;pulo do gato&#8217; se dá na criação do arquivo <em>/root/.smb-credents</em>. E o conteúdo do arquivo ser semelhante a este modelo:</p>
<blockquote><p><code>username=jeferson</code></p>
<p><code>password=minhasenhasecreta</code></p></blockquote>
<p>Com isto, resolvo meu problema de segurança de informações pertinentes a meu usuário e senha, mas&#8230; Todas as vezes que eu precisar mapear apenas uma unidade na rede, terei que fazer estes passos de criação e montagem de diretórios?</p>
<p>Não é mais fácil colocar tudo no /etc/fstab e pronto?</p>
<p>E se eu ter mais diretórios para mapear, também terei que repetir todos estes comandos para cada unidade de rede presente no servidor que pretendo acessar?</p>
<h3>Calma pequeno padawan&#8230; paciência é uma virtude!</h3>
<p>Não quero ficar digitando estes comandos, toda as vezes que eu precisar acessar tais pastas e creio que você também não. Então, depois de criado o <em>/root/.smb-credents</em>, vamos criar nosso primeiro script para começarmos a automatizar o processo. Criei o arquivo /bin/<strong>map.sh</strong>, contendo os comandos para montar os diretórios do servidor &#8220;<a title="SMB" href="http://pt.wikipedia.org/wiki/SMB" target="_blank">SMB</a>&#8220;:</p>
<p><a title="/bin/map.sh" href="http://paste.archlinux-br.org/1351" target="_blank">http://paste.archlinux-br.org/1351</a></p>
<p>Veja que não temos nenhum tipo de controle neste arquivo&#8230; não há verificação da existência de conexão com o servidor; não verifica a existência dos diretórios necessários a montagem das unidades (/media/W2kServer/?) e muito menos, se há automação de todos estes processos&#8230; então, pensei em melhorar isto com a criação de um último script, que se valerá do /bin/map.sh.</p>
<p>O batizei de <strong>mapping.sh </strong>e o que ele faz exatamente o que o título do post indica:</p>
<ul>
<li>Verifica se há conexão de rede e se o servidor com o qual quer se conectar, está &#8216;ouvindo&#8217; (ou de &#8216;pé&#8217;, como preferir);</li>
<li>Havendo conexão, ele criará a estrutura necessária para a conexão no diretório /media e por fim;</li>
<li>Mapeará as pastas disponíveis no servidor, tornando-as acessíveis ao meu usuário.</li>
</ul>
<p>Para isto, a primeira parte do script <a title="Variável" href="http://pt.wikipedia.org/wiki/Vari%C3%A1vel_%28programa%C3%A7%C3%A3o%29" target="_blank">definirá uma Variável</a> ( <strong>LREAD</strong> ):</p>
<blockquote><p><code><strong>LREAD=/tmp/lread.pid</strong></code></p></blockquote>
<p>LREAD, aponta para um arquivo que ainda não existe (<em>/tmp/lread.pid</em>) , mas que será essencial para o funcionamento de nosso pequeno notável.</p>
<p>Como sei o endereço IP de nosso servidor, e que este endereço nunca mudará, ou não mudará tão cedo até que eu decida que ele mude (forte isto.. neh? xD), utilizo o comando ping, verificando se tal host está visível na rede interna:</p>
<blockquote><p><code>ping -c 1 192.168.0.100</code></p></blockquote>
<p>O ping com a opção &#8220;<em>-c 1</em>&#8220;, irá enviar apenas uma requisição solicitando resposta de tal host. O servidor, respondendo, teremos uma saída de informação que se diferencia da saída de erro deste, e isto, nos traz a possibilidade de &#8216;moldar&#8217; ações, conforme os resultados se apresentem.</p>
<p>Resolvi então, concatenar e &#8220;filtrar o resultado&#8221; analisando suas diferenças (o caso do comando <a title="ping" href="http://pt.wikipedia.org/wiki/Ping" target="_blank">ping</a>, irá sempre mostrar em suas saídas a &#8216;palavra&#8217; &#8220;<em>icmp_seq=1</em>&#8220;), conseguindo isto com ajuda do comando <a title="grep" href="http://en.wikipedia.org/wiki/Grep" target="_blank"><em>grep</em></a>. Aproveitando, concateno mais uma vez o resultado, utilizando-se agora do do comando &#8220;<a title="cut" href="http://pt.wikipedia.org/wiki/Cut_%28Unix%29" target="_blank"><em>cut</em></a>&#8220;, veremos que na coluna (carácter) 27, temos números que se diferenciam, trazendo possibilidades, vejam:</p>
<p>O erro nos mostraria a seguinte mensagem:</p>
<blockquote><p><code>From 192.168.0.2 icmp_seq=1 Destination Host Unreachable</code></p></blockquote>
<p>Caso o servidor estiver funcionando e aceitando conexões, nos mostraria isto:</p>
<blockquote><p><code>64 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=3.43 ms</code></p></blockquote>
<p>Em meu caso específico, se houver erro, a coluna 27, me trará o valor <strong>1</strong> no campo &#8216;icmp_seq&#8217;, pelo simples motivo do <a title="Endereço IP" href="http://pt.wikipedia.org/wiki/Endere%C3%A7o_ip" target="_blank">endereço IP</a> do host que uso, seu último octeto estar abaixo do decimal 10, tendo apenas hum (1) numeral: 192.168.0.<strong><em>2</em></strong>.</p>
<p>Já se houver conexão e resposta, por causa do IP &#8220;pingado&#8221; ser 192.168.0.100, a coluna 27 da saída do comando <em>ping -c 1 192.168.0.100 &#124; grep icmp_seq=1 &#124; cut -c27</em> seria o caracter numérico <strong>0</strong>, provindo do último octeto do número IP (100).</p>
<p>Então peguei o resultado disto (<strong>0 </strong>ou <strong>1</strong>) e redirecionei para nossa variável <strong>LREAD</strong> (lembram-se dela, no começo de nossa história? Pois é&#8230;).</p>
<blockquote><p><code><strong>ping -c 1 192.168.0.100 &#124; grep icmp_seq=1 &#124; cut -c27 &#62; $LREAD</strong></code></p></blockquote>
<h3>Um passo importante&#8230;</h3>
<p>Poderiamos utilizar-se do <strong><em>cat</em></strong>, mas neste caso, eu não precisaria declarar a variável LREAD, e prá deixar a coisa mais &#8220;bonita&#8221;, preferi utilizar-me do &#8217;sobrenatural&#8217; <strong><em>while read </em></strong> para ler o conteúdo do arquivo contido na primeira variável e transformá-lo em uma <a title="String" href="http://pt.wikipedia.org/wiki/String" target="_blank"><em>String</em></a> lógica temporária. Para isto&#8230;.</p>
<blockquote><p><code><strong>VRF=`while read LN; do echo $LN ; done &#60; $LREAD`</strong></code></p></blockquote>
<p>Hehehe&#8230;<a title="condições" href="http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-6.html" target="_blank">condições</a>&#8230; o restante é história, e em um shell script começa a mágica com o uso de <a title="if, then, else if, else, fi" href="http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_02.html" target="_blank"><em>if, then, else if, else, fi</em></a>:</p>
<blockquote><p><code><strong>if [ $VRF == 1 ] ; then</strong></code></p></blockquote>
<p>Aqui, estou dizendo o seguinte: <em>- Se a variável VRF for igual a 1, então faça&#8230;</em></p>
<blockquote><p><code> echo Falha de Conexão com o Servidor</code></p>
<p><code> echo Verifique se há conectividade de rede local, ou se o servidor responde a conexões</code></p>
<p><code><strong> else if [ -e /media/W2kServer/I ]; then</strong></code></p></blockquote>
<p>Caso a variável seja diferente de <strong>1</strong>, temos a possibilidade de executar outros comandos e até mesmo buscar e aplicar outras soluções/comandos para potenciais problemas que possam ocorrer, e isto é o que o &#8220;<strong>else if</strong>&#8221; me permite ter. Reparem bem que o &#8216;<em>[ -e /media/W2kServer/I] </em>&#8216;,verificará se o diretório existe, existindo, ele executará uma ação:</p>
<blockquote><p><code><strong> sh /bin/map.sh</strong></code></p>
<p><code><strong> echo Unidades de Rede Mapeadas com sucesso</strong></code></p></blockquote>
<p>Caso não existir, executará outra ação (<strong>; then</strong>).</p>
<blockquote><p><code><strong> else if [ -e /media/W2kServer ]; then</strong></code></p></blockquote>
<p>Observando de perto, criamos inclusive, diretórios que não existem para que o mapeamento funcione corretamente, fechando o circulo perfeitamente (penso eu).</p>
<blockquote><p><code><strong> echo Recriando estrutura de diretórios</strong></code></p>
<p><code><strong> mkdir /media/W2kServer/{F,G,H,I,X,Z} &#38;&#38; sh /bin/map.sh</strong></code></p>
<p><code><strong> echo Unidades de Rede Mapeadas com sucesso</strong></code></p></blockquote>
<p>E assim, vou testando as possibilidades até elas se findarem e o script se tornar um pequeno programa (quase perfeito), cobrindo todas as possibilidades existentes em meu ambiente.</p>
<h3>Continuando&#8230;    e finalizando!</h3>
<blockquote><p><code><strong> else</strong></code></p>
<p><code><strong> echo Criando estrutura de diretórios</strong></code></p>
<p><code><strong> mkdir /media/W2kServer &#38;&#38; mkdir /media/W2kServer/{F,G,H,I,X,Z} &#38;&#38; sh /bin/map.sh</strong></code></p>
<p><code><strong> echo Estrutura recriada e unidades de redes mapeadas com sucesso</strong></code></p>
<p><code><strong> fi</strong></code></p>
<p><code><strong> fi</strong></code></p>
<p><code><strong>fi</strong></code></p></blockquote>
<p>Por fim, temos 3 arquivos essenciais (2 shell scripts, e 1 arquivo contendo as credenciais para acesso ao host).</p>
<p>Como escrevi a principio, estes arquivos para me conectar com tal servidor, me atendem perfeitamente, pois, não há a necessidade de que a conexão seja permanente, sendo executada a cada boot. Porém, ter que digitar vários comandos de criação ou verificar se os diretórios existem, e posteriormente, montar as pastas compartilhadas de servidor em tais diretórios, é algo muito massante com o tempo. O ideal, é ser adaptável e nunca tornar seu trabalho algo chato de se fazer, e com isto, ganho em tempo e agilidade, e também não fico &#8220;ocioso&#8221; com os meus neurônios. Fico feliz de poder compartilhar este pequeno script com todos vocês leitores.</p>
<p>Ahhh&#8230; quem ter uma solução melhor, ou ainda, me passar umas ideias, ou mesmo de como aperfeiçoar e diminuir o tamanho dos scripts eu ficarei grato e receberei com alegria tais colaborações.</p>
<p>Os scripts podem ser baixados e visualizados no <a title="paste.bin do Archlinux-br" href="http://paste.archlinux-br.org/home" target="_blank">paste.bin do Archlinux-br</a>, segue os links:</p>
<p><a title="/bin/map.sh" href="http://paste.archlinux-br.org/1351" target="_blank">http://paste.archlinux-br.org/1351</a></p>
<p><a title="/bin/mapping.sh" href="http://paste.archlinux-br.org/1353" target="_blank">http://paste.archlinux-br.org/1353</a></p>
<p>E nunca se esqueçam do <a title="Guia Foca GNU/Linux" href="http://www.guiafoca.org/" target="_blank">Guia Foca GNU/Linux</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[File Find]]></title>
<link>http://h446log.wordpress.com/2009/10/28/file-find/</link>
<pubDate>Wed, 28 Oct 2009 19:26:43 +0000</pubDate>
<dc:creator>h446log</dc:creator>
<guid>http://h446log.wordpress.com/2009/10/28/file-find/</guid>
<description><![CDATA[Here&#8217;s a shell script that implements the old Norton Utilities &#8220;FileFind&#8221; utility.]]></description>
<content:encoded><![CDATA[Here&#8217;s a shell script that implements the old Norton Utilities &#8220;FileFind&#8221; utility.]]></content:encoded>
</item>
<item>
<title><![CDATA[A safe rm]]></title>
<link>http://h446log.wordpress.com/2009/10/27/a-safe-rm-2/</link>
<pubDate>Tue, 27 Oct 2009 20:11:33 +0000</pubDate>
<dc:creator>h446log</dc:creator>
<guid>http://h446log.wordpress.com/2009/10/27/a-safe-rm-2/</guid>
<description><![CDATA[Here is a script that implements a Windows style &#8216;Recycle Bin&#8217; delete function. Similarl]]></description>
<content:encoded><![CDATA[Here is a script that implements a Windows style &#8216;Recycle Bin&#8217; delete function. Similarl]]></content:encoded>
</item>
<item>
<title><![CDATA[Java - Date validation using SimpleDateFormat]]></title>
<link>http://ykyuen.wordpress.com/2009/10/21/java-date-validation-using-simpledateformat/</link>
<pubDate>Wed, 21 Oct 2009 01:00:49 +0000</pubDate>
<dc:creator>ykyuen</dc:creator>
<guid>http://ykyuen.wordpress.com/2009/10/21/java-date-validation-using-simpledateformat/</guid>
<description><![CDATA[I need to write a program which reads a date string. The program then archives all the data on the s]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I need to write a program which reads a date string. The program then archives all the data on the server with the input date as an cut off date.</p>
<p>The following java program is based on the tutorial in <a href="http://www.dreamincode.net/forums/showtopic14886.htm">&#60;/dream.in.code&#62;</a>. It reads a date string, validate it and print the number of date difference between today and the input date.</p>
<p><strong><font color="#003399">DateCounter.java</font></strong></p>
<pre class="brush: java;">
import java.util.*;
import java.text.*;

public class DateCounter {

        public static void main(String[] args) {
                SimpleDateFormat sdf = new SimpleDateFormat(&#34;dd/MM/yyyy&#34;);
                Date inputDate = null;

                // parse the input date string
                try {
                        inputDate = sdf.parse(args[0]);
                } catch (ParseException e) {
                        // Incorrect input date format. Program exits.
                        System.out.println(&#34;Incorrect date format: &#34; + args[0]);
                        System.out.println(&#34;Valid Date format:     dd/mm/yyyy&#34;);
                        return;
                }

                // Check whether the date is a valid date
                if (!sdf.format(inputDate).equals(args[0])) {
                        // Invalid input date. Program exits.
                        System.out.println(&#34;Invalid date input: &#34; + args[0]);
                        System.out.println(&#34;Please correct the above input date.&#34;);
                        return;
                }

                /* Validation passed */

                // Get today date
                Date today = new Date();
                System.out.println(&#34;Today:     &#34; + sdf.format(today));
                System.out.println(&#34;InputDate: &#34; + sdf.format(inputDate));

                // Calculate the Date difference
                long dateDiff = (inputDate.getTime() - today.getTime()) / 86400000;
                dateDiff++;

                // Print the difference
                System.out.println(&#34;Still have &#34; + dateDiff + &#34; day(s) to go.&#34;);

                /* and do whatever you want ... */
        }
}
</pre>
<p>And i also write a shell script which will compiles the <strong>DateCounter.java</strong> and prompt for a date input in shell.</p>
<p><strong><font color="#003399">run_date_counter.sh</font></strong></p>
<pre class="brush: bash;">
#!/bin/sh

# Complile the DateCounter.java
javac DateCounter.java

# Get the date input from user
echo &#34;****************&#34;
echo &#34;* Date Counter *&#34;
echo &#34;****************&#34;
echo &#34;Date Format: dd/mm/yyyy&#34;
echo &#34;Please input a date for calculation: \c&#34;
read _inputDate

# Run the DateCounter
java DateCounter $_inputDate
</pre>
<p>To run this little program, place them in the same folder and enter<br />
<strong><font color="#CC0000">sh run_date_counter.sh</font></strong></p>
<p>For example, i would like to know how many days i have before <strong><font color="#FF00FF">Tinyan&#8217;s birthday</font></strong>.</p>
<p><font color="#808000"><br />
****************<br />
* Date Counter *<br />
****************<br />
Date Format: dd/mm/yyyy<br />
Please input a date for calculation: <strong>07/11/2009</strong><br />
Today:     21/10/2009<br />
InputDate: 07/11/2009<br />
Still have 17 day(s) to go.<br />
</font></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Que es un "Shell Script" en Linux?]]></title>
<link>http://cambrico.info/2009/10/16/que-es-un-shell-script-en-linux/</link>
<pubDate>Fri, 16 Oct 2009 14:09:10 +0000</pubDate>
<dc:creator>Ruben Antonio Fernández</dc:creator>
<guid>http://cambrico.info/2009/10/16/que-es-un-shell-script-en-linux/</guid>
<description><![CDATA[                      Hoy introduciré el uso de los llamados scripts del shell en la distribución Ub]]></description>
<content:encoded><![CDATA[                      Hoy introduciré el uso de los llamados scripts del shell en la distribución Ub]]></content:encoded>
</item>
<item>
<title><![CDATA[mac address em python]]></title>
<link>http://maltzsama.wordpress.com/2009/10/14/mac-address-em-python/</link>
<pubDate>Wed, 14 Oct 2009 05:00:38 +0000</pubDate>
<dc:creator>maltzsama</dc:creator>
<guid>http://maltzsama.wordpress.com/2009/10/14/mac-address-em-python/</guid>
<description><![CDATA[Algumas pessoas vez ou outra precisam da informação do mac address da placa de rede para qualquer co]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Algumas pessoas vez ou outra precisam da informação do mac address da placa de rede para qualquer coisa. No meu caso é para simples criação de logs, onde o mac address e o serial são os identificadores da maquina. Fazer isso através do shellscript não é tão complicado, mas, eu pelo menos, não sou muito fã de como as coisas ficam &#8220;organizadas&#8221; no shell-script. Então podemos fazer praticamente tudo que o shell faz usando python.<br />
Outro dia estava fuçando como fazer isso, já que minha caminhada em python começou a pouco tempo e eu ainda apanho um bocado, mas para &#8220;facilitar&#8221; ou disseminar o conhecimento colocarei abaixo as linhas de código que achei em um <a href="http://fiorix.wordpress.com/2008/05/04/mac-address-da-placa-de-rede-com-python-linux/">blog</a> de um colega blogueiro.<br />
Primeiramente em shell, poderiamos simplesmente usar um comando e editar a saida dele usando shell. Da seguinte forma:<br />
<code>$mac=$(ifconfig eth0) &#38;&#38; mac=${mac:45:25} &#38;&#38; echo $mac &#62;&#62; arquivo.txt</code><br />
a saida no meu caso foi a seguinte:<br />
<code>00:24:00:b0:e7:00</code><br />
Mas sinceramente isso não fica tão agradavel de se usar&#8230; Pelo menos não para mim&#8230;<br />
Então podemos fazer um pequeno script em python <del>um pouco mais trabalhoso</del> organizado.<br />
<code>import socket<br />
fd = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)<br />
fd.bind(('eth0', 9999))<br />
mac = fd.getsockname()[-1]<br />
print ':'.join(['%02x' % ord(n) for n in mac])<br />
</code><br />
O script em python da mesma forma que o shell apresentará a mesma saida, porém as possibilidades são muito maiores do que se pode fazer.<br />
<code>00:24:00:b0:e7:00</code></p>
<p><strong>OBS1. </strong>O script funciona bem em qualquer Linux. Para qualquer outro sistema você tem que saber qual modulo substitui o AF_PACKET.</p>
<p><strong>OBS2.</strong> Você pode usar uma interpretação do comando ifconfig ou ipconfig no python como acontece no shell script mas isso não seria muito normal de se fazer.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Meu script virou programa!]]></title>
<link>http://luizsanches.wordpress.com/2009/10/13/meu-script-virou-programa/</link>
<pubDate>Tue, 13 Oct 2009 15:41:27 +0000</pubDate>
<dc:creator>Luiz Sanches</dc:creator>
<guid>http://luizsanches.wordpress.com/2009/10/13/meu-script-virou-programa/</guid>
<description><![CDATA[Livro Shell Script Profissional Foi no FISL 9.0 que conheci pessoalmente o Aurélio, não o cara do di]]></description>
<content:encoded><![CDATA[Livro Shell Script Profissional Foi no FISL 9.0 que conheci pessoalmente o Aurélio, não o cara do di]]></content:encoded>
</item>
<item>
<title><![CDATA[Pipes en UNIX / Linux]]></title>
<link>http://cambrico.info/2009/10/13/pipes-en-unix-linux/</link>
<pubDate>Tue, 13 Oct 2009 14:06:32 +0000</pubDate>
<dc:creator>Ruben Antonio Fernández</dc:creator>
<guid>http://cambrico.info/2009/10/13/pipes-en-unix-linux/</guid>
<description><![CDATA[                  En el posting anterior introduje el comando GREP perteneciente al Shell UNIX / Lin]]></description>
<content:encoded><![CDATA[                  En el posting anterior introduje el comando GREP perteneciente al Shell UNIX / Lin]]></content:encoded>
</item>
<item>
<title><![CDATA[Programando em Shell Script]]></title>
<link>http://filipeluciano.wordpress.com/?p=10</link>
<pubDate>Sun, 11 Oct 2009 21:37:11 +0000</pubDate>
<dc:creator>filipeluciano</dc:creator>
<guid>http://filipeluciano.wordpress.com/?p=10</guid>
<description><![CDATA[Teste&#8230;]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Teste&#8230;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Shell + MySQL + GNUPlot = gráficos legais]]></title>
<link>http://danielbauermann.wordpress.com/2009/10/11/shell-mysql-gnuplot/</link>
<pubDate>Sun, 11 Oct 2009 14:08:19 +0000</pubDate>
<dc:creator>Daniel Bauermann</dc:creator>
<guid>http://danielbauermann.wordpress.com/2009/10/11/shell-mysql-gnuplot/</guid>
<description><![CDATA[Fazem 11 meses e 1 dia que escrevi o post sobre como gerar gráficos em shell acessando um banco de d]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Fazem 11 meses e 1 dia que escrevi o <a title="Post sobre geração de gráficos com banco Oracle." href="http://danielbauermann.wordpress.com/2008/11/10/shell-oracle-gnuplot/" target="_self"><em>post</em></a> sobre como gerar gráficos em shell acessando um banco de dados Oracle.</p>
<blockquote><p>Repare na coincidência do dia e mês dos 2 <em>posts</em>!</p></blockquote>
<p>Então para último <a title="Página do evento do DIa da Liberdade de Software 2009 organizado em Novo Hamburgo-RS." href="http://wiki.softwarelivre-vs.org/DiaDaLiberdadeDeSoftware2009" target="_blank">Dia da Liberdade de Software</a> que participei, resolvi montar uma <a title="Página com links para explicar o que são palestras relâmpago." href="http://wiki.softwarelivre.org/SoftwareLivreVS/PalestrasRelampago#O_que_s_o_palestras_rel_mpago" target="_blank">palestra relâmpago</a> sobre este assunto. A ideia era mostrar que era possível gerar gráficos com dados armazenados em um banco de dados a partir do shell.</p>
<p>Como se tratava de um evento sobre liberdade de software, eu não poderia utilizar um banco de dados proprietário! :p Então reescrevi minha função para acessar os dados armazenados em um MySQL.</p>
<blockquote><p>Vejam as voltas que o mundo dá&#8230; Enquanto escrevo este <em>post</em> a Oracle é quase dona do MySQL (falta a união européia decidir)!</p></blockquote>
<p><a title="Programa em shell para geração de gráficos acessando o MySQL." href="http://www2.anaue.com.br/danielbauermann/codigos/gera_grafico_mysql.sh" target="_blank">Aqui</a> é possível encontrar a versão do programa em shell acessando o MySQL. Também deixo disponível a <a title="Palestra (relâmpago) sobre geração de gráficos via shell." href="http://www2.anaue.com.br/danielbauermann/apresentacoes/graficos_shell_mysql_relampago.pdf" target="_self">palestra</a>, caso tenham interesse.</p>
<p>Para o MySQL precisei criar uma função para extração dos dados e geração do arquivo de trabalho (em Oracle, essa execução estava dentro do próprio programa shell). A função criada no MySQL está comentada dentro do próprio .sh.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[How to take domain database backup in plesk]]></title>
<link>http://gnufreakz.wordpress.com/2009/10/11/how-to-take-domain-database-backup-in-plesk/</link>
<pubDate>Sun, 11 Oct 2009 10:56:04 +0000</pubDate>
<dc:creator>gnufreakz</dc:creator>
<guid>http://gnufreakz.wordpress.com/2009/10/11/how-to-take-domain-database-backup-in-plesk/</guid>
<description><![CDATA[# cat domain_dump.sh var_remote=&#8217;remote_ip_address&#8217; mkdir /root/dump_temp/ mysql -u admi]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><span style="font-family:Verdana;font-size:13px;"># cat domain_dump.sh<br />
var_remote=&#8217;remote_ip_address&#8217;<br />
mkdir /root/dump_temp/<br />
mysql -u admin -p`cat /etc/psa/.psa.shadow ` -e &#8220;show databases&#8221; &#124;grep -v &#8220;-&#8221; &#124;grep -Ev &#8216;Database&#124;information_schema&#8217; &#62;&#62; /root/backuplist<br />
for i in `cat /root/backuplist`;<br />
do<br />
echo &#8220;database is $i&#8221;<br />
mysqldump -u admin -p`cat /etc/psa/.psa.shadow` $i &#62; /root/dump_temp/$i.sql<br />
echo &#8220;dump of $i created&#8221;<br />
done<br />
echo &#8220;Creating the tar file in /root&#8221;<br />
cd /root<br />
tar -cvzf /root/dump_`date +&#8221;%Y-%m-%d&#8221;`.tar.gz dump_temp/<br />
lftp $var_remote&#60;&#60;EOF &#124; sort&#62;$TMPFILE<br />
user &#8220;username&#8221; &#8220;password&#8221;<br />
cd IP/directory<br />
put dump_`date +&#8221;%Y-%m-%d&#8221;`.tar.gz<br />
EOF<br />
echo &#8220;Deleteing the backup files&#8221;<br />
rm -rf /root/dump_temp<br />
rm -rf /root/dump_`date +&#8221;%Y-%m-%d&#8221;`.tar.gz</span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Shell Script pt.1]]></title>
<link>http://nzcorp.wordpress.com/2009/10/10/shell-script-pt1/</link>
<pubDate>Sat, 10 Oct 2009 18:09:52 +0000</pubDate>
<dc:creator>Lucas Ribeiro</dc:creator>
<guid>http://nzcorp.wordpress.com/2009/10/10/shell-script-pt1/</guid>
<description><![CDATA[﻿ Quem usa Linux já viu alguma vez, o prompt de comando(Mais conhecido como Shell). Só que muitas pe]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><!-- ======================================================= --> <!-- Created by AbiWord, a free, Open Source wordprocessor.  --> <!-- For more information visit http://www.abisource.com.    --> <!-- ======================================================= --> <!-- #toc, .toc, .mw-warning { 	border: 1px solid #aaa; 	background-color: #f9f9f9; 	padding: 5px; 	font-size: 95%; } #toc h2, .toc h2 { 	display: inline; 	border: none; 	padding: 0; 	font-size: 100%; 	font-weight: bold; } #toc #toctitle, .toc #toctitle, #toc .toctitle, .toc .toctitle { 	text-align: center; } #toc ul, .toc ul { 	list-style-type: none; 	list-style-image: none; 	margin-left: 0; 	padding-left: 0; 	text-align: left; } #toc ul ul, .toc ul ul { 	margin: 0 0 0 2em; } #toc .toctoggle, .toc .toctoggle { 	font-size: 94%; }@media print, projection, embossed { 	body { 		padding-top:1in; 		padding-bottom:1in; 		padding-left:1in; 		padding-right:1in; 	} } body { 	font-family:'Times New Roman'; 	color:#000000; 	widows:2; 	font-style:normal; 	text-indent:0in; 	font-weight:normal; 	text-align:left; 	font-variant:normal; 	text-decoration:none; 	font-size:12pt; } table { } td { 	border-collapse:collapse; 	text-align:left; 	vertical-align:top; } p, h1, h2, h3, li { 	color:#000000; 	font-family:'Times New Roman'; 	font-size:12pt; 	text-align:left; 	vertical-align:normal; } *.block_text { 	margin-bottom:6pt; 	margin-left:1in; 	margin-right:1in; } --></p>
<div>
<p>﻿</p>
<p><span style="font-size:8pt;">Quem usa Linux já viu alguma vez, o prompt de comando(Mais conhecido como Shell). Só que muitas pessoas que usam a Shell não sabem, que a própria possui uma poderosa linguagem script embutida. Essa linguagem pode ajudar você a automatizar o serviço do dia-a-dia, como por exemplo, apagar arquivos temporários antigos, fazer back-up automático entre outras coisas.</span></p>
<p><span style="font-size:8pt;">Uma das melhores vantagens dessa liguagem é que não precisa ser compilada, basta criar um arquivo de texto, colocar os comando desejados, dar permissão de execução pelo chmod e pronto para ser executado!</span></p>
<p><span style="font-size:8pt;">Vamos ao que interessa ! </span></p>
<p><span style="font-size:8pt;">Bom, vamos criar um pequeno script de exemplo. Abra seu editor de textos favorito, e insira nele às seguintes linhas :</span></p>
<blockquote><p><span style="font-size:8pt;">#!/bin/bash</span></p>
<p><span style="font-size:8pt;">echo &#8220;Hello World&#8221;</span></p></blockquote>
<p><span style="font-size:8pt;">Salve que quiser, para executar, basta ir à um console e digitar chmod +x nomedoscript</span></p>
<p><span style="font-size:8pt;">Vamos às explicações das linhas :</span></p>
<p><span style="font-size:8pt;">A primeira linha &#8220;#!/bin/bash&#8221; define qual interpretador iremos usar, poderia ser #!/bin/sh entre outras variações.</span></p>
<p><span style="font-size:8pt;">A segunda linha já mostra o comando &#8220;echo&#8221;, que serve para imprimir informações na tela.</span></p>
<p><span style="font-size:8pt;">Simples né ?</span></p>
<p><span style="font-size:8pt;">Agora, vamos fazer algo mais legal <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </span></p>
<p><span style="font-size:8pt;"><br />
<h2>Conceito de variáveis</h2>
<p></span></p>
<p><span style="font-size:8pt;">As variáveis são, nada mais que, uma espécie de atalho. Em shell script, as variáveis são reconhecidas pelo cifrão ($) no início do nome.</span></p>
<p><span style="font-size:8pt;">Para declarar uma variável, usamos a seguinte sintaxe</span></p>
<blockquote><p><span style="font-size:8pt;">var=&#8221;valor&#8221;</span></p></blockquote>
<p><span style="font-size:8pt;">O &#8220;valor&#8221; será atribuido a variável $var. O &#8220;valor&#8221; pode ser uma palavra, frase, números e outros comandos. O valor de uma variável pode ser expresso pelas aspas (&#8221; &#8220;), apóstrofos (&#8216; &#8216;) ou crases (` `). As aspas irão ler as variáveis que estão dentro do valor, os apóstrofos irão ler tudo como texto e as crases irão executar um comando e atribuir o valor à váriavel.</span></p>
<p><span style="font-size:8pt;">Exemplo : </span></p>
<blockquote>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">[zero@Nightmare ~]$ lucas=&#8221;Zero&#8221;</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">[zero@Nightmare ~]$ echo &#8220;Meu apelido é $lucas&#8221;</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Meu apelido é Zero</span></p>
</blockquote>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Maaaas, caso queira criar um script em que o usuário deve interagir, existe o comando read. O comando read fica esperando até que o usuário digite algo.</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Exemplo :</span></p>
<blockquote>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">[zero@Nightmare ~]$ read Zero</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Nightmare</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">[zero@Nightmare ~]$ echo $Zero</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Nightmare</span></p>
</blockquote>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Bom, hoje é só, eu atrasei o conteúdo, mas logo coloco mais, não fiquem bravos comigo, Ok ? (:</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Abraços</span></p>
<p style="text-align:left;" dir="ltr"><span style="font-size:8pt;">Zero</span></p>
</div>
</div>]]></content:encoded>
</item>

</channel>
</rss>
