Primeira parte, uma introdução

Quem usa Linux conhece bem o prompt de comando sh, ou variações como o bash. O ue muita gente não sabe é que o sh ou o bash têm uma ³poderosa´ linguagem de script embutido nelas mesmas. Diversas pessoas utilizam-se desta linguagem para facilitar a realização de inúmeras tarefas administrativas no Linux, ou até mesmo criar seus próprios programinhas. Patrick Volkerding, criador da distribuição Slackware, utiliza esta linguagem para toda a instalação e configuração de sua distribuição. Você poderá criar scripts para automar as tarefas diárias de um servidor, para efetuar backup automático regularmente, procurar textos, criar formatações, e muito mais. Para você ver como esta linguagem pode ser útil, vamos ver alguns passos introdutórios sobre ela. Interpretadores de comandos são programas feitos para intermediar o usuário e seu sistema. Através destes interpretadores, o usuário manda um comando, e o interpretador o executa no sistema. Eles são a ³Shell´ do sistema Linux. Usaremos o interpretador de comandos bash, por ser mais ³extenso´ que o sh, e para que haja uma melhor compreensão das informações obtidas aqui, é bom ter uma base sobre o conceito de lógica de programação. Uma das vantagens destes shell scripts é que eles não precisam ser compilados, ou seja, basta apenas criar um arquivo texto qualquer, e inserir comandos à ele. Para dar à este arquivo a definição de ³shell script´, teremos que incluir uma linha no começo do arquivo (#!/bin/bash) e torná-lo ³executável´, utilizando o comando chmod. Vamos seguir com um pequeno exemplo de um shell script que mostre na tela: ³Nossa! Estou vivo!´:
#!/bin/bash echo 'Nossa! Estou vivo!'

Fácil, hein? A primeira linha indica que todas as outras linhas abaixo deverão ser executadas pelo bash (que se localiza em /bin/bash), e a segunda linha imprimirá na tela a frase ³Nossa! Estou vivo!´, utilizando o comando echo, que serve justamente para isto. Como você pôde ver, todos os comandos que você digita diretamente na linha de comando, você poderá incluir no seu shell script, criando uma série de comandos, e é essa combinação de comandos que forma o chamado shell script. Tente também dar o comando µfile arquivo¶ e veja que a definição dele é de Bourne-Again Shell Script (Bash Script). Contudo, para o arquivo poder se executável, você tem de atribuir o comando de executável para ele. E como citamos anteriormente, o comando chmod se encarrega disto:
$ chmod +x arquivo

Pronto, o arquivo poderá ser executado com um simples ³./arquivo´.

Conceito de Variáveis em shell script
Variáveis são caracteres que armazenam dados, uma espécie de atalho. O bash reconhece uma variável quando ela começa com $, ou seja, a diferença entre µpalavra¶ e

µ$palavra¶ é que a primeira é uma palavra qualquer, e a outra uma variável. Para definir uma variável, utilizamos a seguinte sintaxe:
variavel="valor"

O µvalor¶ será atribuído a µvariável µ. Valor pode ser uma frase, números, e até outras variáveis e comandos. O valor pode ser expressado entre as aspas (³´), apóstrofos (´) ou crases (³). As aspas vão interpretar as variáveis que estiverem dentro do valor, os apóstrofos lerão o valor literalmente, sem interpretar nada, e as crases vão interpretar um comando e retornar a sua saída para a variável. Vejamos exemplos:
$ variavel="Eu estou logado como usuário $user" $ echo $variavel Eu estou logado como usuário cla $ variavel='Eu estou logado como usuário $user' $ echo $variavel Eu estou logado como usuário $user $ variavel="Meu diretório atual é o `pwd`" $ echo $variavel Meu diretório atual é o /home/cla

Se você quiser criar um script em que o usuário deve interagir com ele, é possível que você queira que o próprio usuário defina uma variável, e para isso usamos o comando read, que dará uma pausa no script e ficarará esperando o usuário digitar algum valor e teclar enter. Exemplo:
echo "Entre com o valor para a variável: " ; read variavel (O usuário digita e tecla enter, vamos supor que ele digitou 'eu sou um frutinha') echo $variavel eu sou um frutinha

Controle de fluxo com o if
Controle de fluxo são comandos que vão testando algumas alternativas, e de acordo com essas alternativas, vão executando comandos. Um dos comandos de controle de fluxo mais usados é certamente o if, que é baseado na lógica ³se acontecer isso, irei fazer isso, se não, irei fazer aquilo´. Vamos dar um exemplo:
if [ -e $linux ] then echo 'A variável $linux existe.' else echo 'A variável $linux não existe.' fi

O que este pedaço de código faz? O if testa a seguinte expressão: Se a variável $linux existir, então (then) ele diz que que existe com o echo, se não (else), ele diz que não

existe. O operador -e que usei é pré-definido, e você pode encontrar a listagem dos operadores na tabela: -eq Igual -ne Diferente -gt Maior -lt Menor -o Ou -d Se for um diretório -e Se existir -z Se estiver vazio -f Se conter texto -o Se o usuário for o dono -r Se o arquivo pode ser lido -w Se o arquivo pode ser alterado -x Se o arquivo pode ser executado

Outras alternativas
Existem inúmeros comandos no Linux, e para explicar todos, teríamos de publicar um verdadeiro livro. Mas existem outras possibilidades de aprendizado desta língua, que também é usado em todas as programações. Primeiro de tudo você pode dar uma olhada na manpage do bash (comando man bash), que disponibilizará os comandos embutidos no interpretador de comandos. Uma das coisas essencias para o aprendizado é sair coletando exemplos de outros scripts e ir estudando-os minuciosamente. Procure sempre comandos e expressões novas em outros scripts e em manpages dos comandos. E por último, mas não o menos importante, praticar bastante! Na tabela a seguir, você pode encontrar uma listagem de comandos para usar em sua shell script: echo Imprime texto na tela read Captura dados do usuário e coloca numa variável exit Finaliza o script sleep Dá uma pausa em segundos no script clear Limpa a tela stty tput if for Configura o terminal temporariamente Altera o modo de exibição Controle de fluxo que testa uma ou mais expressões Controle de fluxo que testa uma ou mais expressões

case Controle de fluxo que testa várias expressões ao mesmo tempo while Controle de fluxo que testa uma ou mais expressões

E assim seja, crie seus próprios scripts e facilite de uma vez só parte de sua vida no Linux!

Segunda parte, se aprofundando mais!
Falamos sobre o conceito da programação em Shell Script, e demos o primeiro passo para construir nossos próprios scripts. Agora vamos nos aprofundar nos comandos mais complicados, aprendendo a fazer programas ainda mais úteis. Nestes comandos estão inclusos o case e os laços for, while e until. Além disso, vamos falar de funções e, por último, teremos um programa em shell script.

Case
O case é para controle de fluxo, tal como é o if. Mas enquanto o if testa expressões não exatas, o case vai agir de acordo com os resultados exatos. Vejamos um exemplo:
case $1 in parametro1) comando1 ; comando2 ;; parametro2) comando3 ; comando4 ;; *) echo "Você tem de entrar com um parâmetro válido" ;; esac

Aqui aconteceu o seguinte: o case leu a variável $1 (que é o primeiro parâmetro passado para o programa), e comparou com valores exatos. Se a variável $1 for igual à ³parametro1 , então o programa executará o comando1 e o comando2; se for igual à ³parametro2 , executará o comando3 e o comando4, e assim em diante. A última opção (*), é uma opção padrão do case, ou seja, se o parâmetro passado não for igual a nenhuma das outras opções anteriores, esse comando será executado automaticamente. Você pode ver que, com o case fica muito mais fácil criar uma espécie de ³menu´ para o shell script do que com o if. Vamos demonstrar a mesma função anterior, mas agora usando o if:
if [ -z $1 ]; then echo "Você tem de entrar exit elif [ $1 = "parametro1" ]; comando1 comando2 elif [ $1 = "parametro2" ]; comando3 comando4 else echo "Você tem de entrar fi com um parâmetro válido" then then

com um parâmetro válido"

Veja a diferença. É muito mais prático usar o case! A vantagem do if é que ele pode testar várias expressões que o case não pode. O case é mais prático, mas o if pode substituí-lo e ainda abrange mais funções. Note que, no exemplo com o if, citamos um ³comando´ não visto antes: o elif ± que é uma combinação de else e if. Ao invés de fechar o if para criar outro, usamos o elif para testar uma expressão no mesmo comando if.

até que a ³$variavel´ não seja mais igual a ³valor´. Você pode deixá-los todos com letras minúsculas ou maiúsculas sem precisar renomear cada um manualmente. Em seguida ele atribui outro valor do comando ³*´ para a variável $1 e reexecutou os comandos. Veja o exemplo: for i in * do cp $i $i. depois executou o bloco de comandos. Se no bloco dos comandos a ³$variavel´ mudasse. then mv $original $resultado fi done Aqui. pode organizar dados. o arquivo é renomeado para o valor da variável $resultado. Outro exemplo: for original in *. Para transformar em letras minúsculas.backup mv $i. mas com letras minúsculas. e vai executando os comandos pedidos. usei o comando tr. o que ocorre é a transformação de letras maiúsculas para minúsculas. uma variável chamada $resultado irá conter o arquivo em letras minúsculas. pois agora a expressão $variavel = ³valor´ não seria mais verdadeira. fazer backup. Como os exemplos ilustram.backup /usr/backup done Primeiramente o laço for atribuiu o valor de retorno do comando ³*´ (que é equivalente a um ls sem nenhum parâmetro) para a variável $i. Isso se repete até que não sobrem valores de retorno do comando ³*´. Until . do resultado=`echo $original | tr '[:upper:]' '[:lower:] '` if [ ! -e $resultado ]. entre outras coisas. do comando1 comando2 done O que acontece aqui é o seguinte: enquanto a ³$variavel´ for igual a ³valor´. o while iria parar de executar os comandos quando chegasse em done. While O while testa continuamente uma expressão. até que ela se torne falsa. o laço for pode ser bem útil no tratamento de múltiplos arquivos. o while ficará executando os comandos 1 e 2. de mesmo nome. Caso não exista um arquivo igual e com letras minúsculas. Para cada arquivo que o laço lê. Exemplo: variavel="valor" while [ $variavel = "valor" ].For O laço for vai substituindo uma variável por um valor.

Se a variável ³$count´ não for igual a 0. Então usamos um if para atribuir o valor 0 para a variável ³$var´. soma-se 1 a ela.Tem as mesmas características do while. se a variável ³$count´ for igual a 9. a única diferença é que ele faz o contrário. Neste caso ele será executado na mesma script shell em que está sendo usado o comando. Para utilizar outra shell. porque cada vez que o comando do bloco de comandos é executado. você só precisa incluir o seguinte comando no seu script shell: . sintaticamente invertido. soma-se 1 à variável ³$count´. do comando1 comando2 if [ $count = 9 ]. serve para o while também: var=1 count=0 until [ $var = "0" ]. o bloco de comandos será executado desde que a expressão $variavel = ³valor´ não seja verdadeira. Isso cria um laço que executa o comando 10 vezes. bashscript2 Isso executará o script shell ³bashscript2 durante a execução do seu script shell. then var=0 fi count=`expr $count + 1` done Primeiro. o until pára de executar os comandos quando chega ao done.´ pelo executável da shell. enquanto a variável ³$var´ for igual a ³0 . atribuímos à variável ³$var´ o valor ³1 . O until executa os comandos 1 e 2. A variável ³$count´ será uma contagem para quantas vezes quisermos executar o bloco de comandos. assim: sh script2 . você simplesmente substitui o ³. e se você precisar executar em um script shell um outro script externo para que este faça alguma função e não precisar reescrever todo o código? É simples. No exemplo. do comando1 comando2 done Ao invés de executar o bloco de comandos (comando1 e comando2) até que a expressão se torne falsa. a variável ³$var´ é igualada a zero. Usando vários scripts em um só Pode-se precisar criar vários scripts shell que fazem funções diferentes. o until testa a expressão e executa o bloco de comandos até que a expressão se torne verdadeira. Veja o exemplo abaixo: variavel="naovalor" until [ $variavel = "valor" ]. quebrando assim o laço until. Vejamos um exemplo para o until que. mas. Se no bloco de comandos a variável for definida como ³valor´. e quando chega em 9.

} Fácil de entender. na página de manual do bash (comando ³man bash´. não? A função funcionará como um simples comando próprio.. Adicionar um usuário no sistema" echo "3. Trasformar nomes de arquivos" echo "2. A flexibilidade das funções permite facilitar a vida do programador. e o script3 com a shell tcsh. Praticamente todas as linguagens usam funções que ajudam a organizar o código. Sair do exemplo" . já predefinidas. Variáveis especiais $0 $1$9 $# $? $$ Nome do script que está sendo executado Parâmetros passados à linha de comando Número de parâmetros passados Valor de retorno do último comando ou de todo o shell script. Vejamos a sintaxe de uma função: funcao() { comando1 comando2 ..tcsh script3 Nessas linhas o script2 será executado com a shell sh. #!/bin/bash # Exemplo Final de Script Shell Principal() { echo "Exemplo Final sobre o us o de scripts shell" echo "-----------------------------------------. Você executa a função em qualquer lugar do script shell. Funções Funções são blocos de comandos que podem ser definidos para uso posterior em qualquer parte do código. Deletar um usuário no sistema" echo "4. e os comandos 1. Fazer backup do s arquivos do /etc" echo "5. 2 e outros serão executados. (o comando ³exit 1 retorna o valor 1) Número do PID (Process ID) Você também encontra muitas variáveis." echo "Opções:" echo echo "1. como no exemplo final. seção Shell Variables). Exemplo Final Agora vamos dar um exemplo de um programa que utilize o que aprendemos com os artigos.

then mv $x $y fi done fi } Adicionar() { clear echo -n "Qual o nome do usuário a se adicionar? " read nome adduser nome Principal } Deletar() { clear echo -n "Qual o nome do usuário a deletar? " read nome userdel nome Principal } Backup() { for x in `/bin/ls` /etc. do y=`echo $x | tr '[:lower:]' '[:upper:]'` if [ ! -e $y ].. echo . then mv $x $y fi done elif [ $var = "m" ]. esac } Transformar() { echo -n "Para Maiúsculo ou minúsculo? [M/m] " read var if [ $var = "M" ]. do cp -R /etc/$x /etc/$x. do y=`echo $x | tr '[:upper:]' '[:lower:]'` if [ ! -e $y ]..echo echo -n "Qual a opção desejada? " read opcao case $opcao in 1) Transformar . 3) Deletar .. janelas graficas . then echo -n "Que diretório? " read dir for x in `/bin/ls` $dir.bck /usr/backup done } Principal Terceira parte.bck mv /etc/$x. *) "Opção desconhecida. 5) exit .. then echo -n "Que diretório? " read dir for x in `/bin/ls` $dir. 4) Backup . 2) Adicionar ." ... Principal .

e se apertou em Não.4.4./configure.tar. e entrando nele você estará pronto para compilá-lo e instalá-lo. E agora vamos à ação! Como aprendemos nos artigos anteriores. darei aqui dicas de como usar janelas gráficas em seus shell-scripts. Note que a \ (barra) serve para indicar à shell para continuar o comando da linha seguinte. o binário do Xdialog será colocado em /usr/local/bin. Vamos ver um primeiro exemplo: #!/bin/bash Xdialog --title "Exemplo número 1!" --center --stdout --yesno \ "Isto é legal?" \ 0 0 echo $? Como você pôde ver.5. que eu coloquei apenas para indicar qual foi o retorno da pergunta. pois é muito simples. Como último comando do exemplo dado. Através do programa Xdialog. Pronto. No passo do make install.free. temos o echo $?.5 será criado.4. Obtenha o programa no CD da Revista ou visite o endereço oficial do Xdialog. Com esse recurso. que é http://xdialog. Isso mesmo. radios. Um diretório chamado Xdialog-1. utilizadas facilmente em seu shell-script.tar. O Xdialog ao invés de usar a biblioteca ncurses. vimos algumas coisas básicas e lógicas de programação em shell no Linux.fr.5.tar. Você deseja continuar com o programa?" \ 0 0 if [ $? = "0" ]. em shell-script é só colocar o comando dentro do arquivo que ele já vai ser executado quando o script for executado. Aqui eu peguei o arquivo Xdialog-1. o retorno vai ser 0. janelas que rodam no ambiente gráfico.bz2.Nos dois topicos anteriores. Então só o que temos de aprender aqui é como usar o Xdialog. então estas três linhas são que nem uma só. o programa Xdialog gerou uma janela com título ³Exemplo número 1!´.4. Podemos usar este retorno para controlar o que o usuário escolher. e logo em seguida tar xpvf Xdialog-1. etc. vamos ver o que você quer fazer. depois make e por último make install. Caso o usuário apertou em Sim.bz2. Agora para completar. então você terá de pegar e compilar o programa. Não é comum o Xdialog estar incluso nas distribuições. perguntando ³Isto é legal?´ e com opções de Sim e Não. Não vai ser preciso saber muita coisa de programação em shell. um programa para console que gera ³janelas´ no console (aquelas da instalação do Slackware) usando a biblioteca ncurses. Para fazer isso use os comandos . Vejamos um exemplo: Xdialog --title "Exemplo número 2!" --center --stdout --yesno \ "Neste exemplo. usa a Xlib para criar as janelas no ambiente gráfico.5. seleçÕes. você poderá criar os mais variados tipos de janelas para o programa: caixas de texto. vai ser 1. agora você já poderá utilizar o Xdialog através de qualquer shellscript. then echo "Que bom! Você continuou o programa! Parabéns!" . vai ser possível deixar o seu programa bem amigável. Primeiro descompacte-o com o comando bunzip2 Xdialog-1. Primeiro de tudo será necessário você obter o Xdialog no seu sistema. e agora vamos aos passos básicos para instalar ele. O Xdialog é uma idéia que vem do dialog/cdialog.

Isto ocorreu pelo fato de eu ter colocado o direcionador 2> para o arquivo resposta. Se eu colocasse a opção ±stdout na linha de comando do Xdialog. Isto é chamado de checklist." fi Viu como funciona? Agora vamos ver outros recursos que o Xdialog pode oferecer. poderia ir para um arquivo como no exemplo anterior. se você praticar bastante pode criar \ \nprogra mas incríveis e facilmente. Tente você." \ 0 0 O usuário aperta Ok e o shell-script continua normalmente. Vamos esclarecer uma coisa aqui também« Depois do texto ³Qual sua distribuição Linux favorita?´. Agora usei o ±msgbox. a resposta do usuário apareceria na tela. No primeiro exemplo eu usei a opção ±yesno que gerava o sim e não. e pode ser visto no exemplo a seguir: . Estes dois números correspondem à altura e comprimento da janela. vamos ao exemplo: Xdialog --title "Exemplo de Menu" --center --stdout --menubox \ "Qual sua distribuição Linux favorita?" \ 20 50 0 \ 1 "Slackware" \ 2 "Debian" \ 3 "Red Hat" \ 4 "Conectiva Linux" \ 5 "Eu tenho minha própria distribuição" Viu como é fácil? O que o usuário escolher vai aparecer como resultado no console (por causa da opção ±stdout).elif [ $? = "1" ]. a resposta que este usuário digitou será gravada no arquvio resposta. vamos criar uma janela em que o usuário poderá escolher uma ou mais opções. Mas e se você quiser que o usuário digite algo e isto seja gravado em um arquivo por exemplo? Vamos ver este exemplo: Xdialog --title "Que Anime que você mais gosta ?" --center --inputbox \ "Se você sabe o que é Anime. Primeiro vamos gerar uma simples mensagem pro usuário ver: Xdialog --title "Aviso" --center --stdout --msgbox \ "Este programa é apenas um exemplo pa ra você ver como o Xdialog \ \nfunciona. Mais uma vez. é só mudar estes dois números. que é uma das coisas mais importantes num programa.. Apropósito. Então já sabe. Agora como último exemplo. then echo "Você saiu do programa. Se eu colocasse o redirecionador 2>. Vamos ver agora seleção de itens.. que daria muito mais \ \ntrabalho fazendo em outras linguagens. se quiser mudar o tamanho da janela. Desta vez usaremos a opção ±menubox para gerar um menu com os itens a serem selecionados. há 2 números. Eu vou dar vários exemplos aqui e sair comentando cada opção. Nos exemplos anteriores eu coloquei ³0 0 pois aí o Xdialog dimensiona automaticamente o tamanho da janela. e gosta." \ 0 0 2> resposta Depois que o usuário preenche o campo e dá Ok. qual o seu preferido? \n \ Sua resposta será gravada no arquivo resposta. Você precisará praticar bastante e conhecer as várias opções.

com uma barra de rolagem rangebox ±textbox ±editbox Mostra o conteúdo de um arquivo numa caixa de texto Edita o conteúdo de um arquivo numa caixa de texto ± Cria um Menu de opções. Se você pensa que isto é tudo. Bem fácil criar uma interface amigável para suas shell-scripts.checklist" --center --checklist \ "Como se pronuncia Linux?" \ 0 0 0 \ "Opção 1" "Láinucs" off \ "Opção 2" "Lenocs" off \ "Opção 3" "Linúcs" off \ "Opçào 4" "Línucs" on \ "Opção 5" "GNUUU/Linux" off Veja agora a diferença entre esta checklist e o menu do exemplo anterior. ainda tem muito mais por trás do Xdialog. as mesmas serão o resultado. O que você deverá fazer é sair testando todas as opções e se impressionar :) ±yesno Uma janela com opções de ³Sim´ ou ³Não´ Mesmo que ±msgbox. Espero que estas informações foram úteis a você e até a próxima :) . O on indica que esta opção deverá já estar marcada.Xdialog --title "Último exemplo . só que desaparece automaticamente em um determinado tempo ±msgbox Apenas mostra um texto informativo ±infobox ±inputbox O usuário preenche um campo ± Escolhe um número entre X e Y. Para não ter que ficar comentando cada opção. Verifique que depois de cada opção há o on e o off. você pode usar a mesma sintaxe para criar estas ³janelas´ no modo console. Outra coisa. vou dar uma lista de parâmetros e a descrição de suas funções. e o off que não deverá estar marcada. Se o usuário escolher 3 opções. sintase a vontade para me mandar um e-mail. Se você fizer algum programa legal em shell-script. como o Xdialog é uma idéia tirada do dialog/cdialog (existe também o whiptail que é parecido). mas agora em outro estilo ±treeview Opções organizadas em forma de ³árvore´ (interessante) ±gauge ±tailbox ±fselect ±dselect Um indicador de processo Mostra o conteúdo de um arquivo Abre uma janela de seleção de um arquivo Abre uma janela de seleção de um diretório ±calendar Mostra um calendário para escolher uma data ±timebox Mostra uma janela para edição de horário Você também pode encontrar alguns exemplos no diretório samples que vem junto com o código-fonte do programa. onde se seleciona um item menubox ±checklist Mesmo que ±menubox. só que pode-se selecionar vários itens ±radiolist Mesmo que ±menubox.

o mesmo entra em uma shell. tcsh. então o executou. Completação por Tab . só será possível executá-lo especificando seu caminho completo: $ /opt/programa/nonpath E se um arquivo executável estiver no diretório atual. Executando comandos Como um interpretador de comandos. ksh. como o sh. no Linux existem os chamados links simbólicos. o bash procurou nos diretórios do PATH e achou um comando chamado ls no diretório /bin. entre outras. o bash irá executá-lo. que são uma espécie de atalhos.com). os caracteres MAIÚSCULOS e minúsculos fazem diferença.Utilizando o bash Após o login de um usuário no modo texto. Ou então: ls é um comando e LS é um erro. bash. .tar. para executar um comando. Uma shell é um interpretador de comandos: ela lê o que o usuário digita. Por exemplo. não existem extensões especiais para programas executáveis (como . Ao invés disso. interpreta e executa as aplicações de acordo com o que você executou. o que o bash sabe fazer de melhor é: executar comandos! Assim como os prompts de comando da maioria dos sistemas operacionais. Caso o programa exista e o arquivo for executável. aperte CTRL+D ou execute o comando exit. Isso quer dizer que por exemplo: os arquivos PROGRAMA. Neste treinamento estaremos trabalhando com a shell GNU bash (GNU Bourne-Again SHell). tclsh.tar. Agora se um programa executável estiver fora do PATH./programa Para sair da shell (logout). os arquivos têm permissão de executável ou não-executável.exe. para executar o comando que lista arquivos no diretório atual: $ ls Quando o usuário digitou ls.gz são dois arquivos completamente diferentes. Mais detalhes no Além de arquivos comuns. pois ela é a mais utilizada por padrão em todas as distribuições Linux. executamos o comando: $ . Mais detalhes no comando ln. o bash lê o que o usuário digitou e procura em diretórios pré-definidos (PATH) se aquele comando existe. No Linux. Características dos arquivos no Linux Nos nomes dos arquivos. Existem diversos tipos de shells.gz e programa.

indicando ³(reverse-isearch)`¶:´. basta reconfigurar a variável da seguinte forma: $ PATH=$PATH:/novodiretorio No comando acima. basta apenas manipular a variável do bash chamada de $PATH. Caso haja mais de um arquivo começando com as letras que você digitou. O bash irá completar o nome do comando ou arquivo para você automaticamente. Quando um comando está dentro de um diretório PATH. Por padrão o bash implementa um histórico com uma lista de todos os comandos que você digitou. Para utilizar. Para procurar por um comando digitado anteriormente. para executar comandos. Então para adicionar um novo diretório no PATH. Agora o /novodiretorio também estará no PATH. se você simplesmente apertar Tab duas vezes sem ter digitado nada. Se for necessário mudar o PATH para adicionar um diretório de algum programa que você instalou. Se ele achou um comando e você quer procurar por outros comandos que têm a mesma palavra. atribuímos à variável $PATH o valor dela mesma. Quando feito isso. basta apenas digitar as primeiras letras do comando ou arquivo e apertar a tecla Tab.A completação por Tab é um recurso que permite completar comandos ou nomes de arquivos mais rapidamente. o bash irá lhe apresentar todos os comandos disponíveis no sistema! Configurando o PATH Quando falamos em PATH. se você quiser saber todos os comandos que começam com as letras mo. Procurando por comandos já digitados Uma boa forma de salvar tempo é utilizar comandos já digitados ao invés de digitá-los novamente. comece apertando a sequência de teclas CTRL+R. queremos dizer se um determinado diretório está acessivel sempre. sem precisar digitar todos os caracteres. Comece a digitar o comando e ele vai tentando achar para você. Para ver os atuais diretórios que estão no PATH da sua sessão atual. execute na shell: $ mo module-assistant mogrify montage more mount mountpoint mozilla mozilla -firefox Imagine. quer dizer que de qualquer lugar você poderá executá-lo. digite o seguinte comando: $ echo $PATH /home/coletivo/bin:/usr/local/bin:/usr/bin:/bin Acima podemos ver que os diretórios no PATH são separados por dois pontos. de qualquer lugar. dentro do diretório HOME de cada usuário. Este histórico fica no arquivo . Por final. o prompt muda. .bash_history. Por exemplo. apertando Tab mais uma vez fará com que o bash apresente todas as opções disponíveis. adicionando :/novodiretorio. continue apertando CTRL+R para visualizar o que ele achou a mais.

Por exemplo.quando encontrar o comando desejado. ou apelidos. onde um programa fica funcionando. executar vários programas ao mesmo tempo. posso criar um alias chamado ³comando´ da seguinte forma: $ alias comando=´comando_realmente_grande -lZdsW´ Então toda vez que eu digitar comando. comece executando uma aplicação que ficará funcionando no plano ativo: $ man bash . Além do plano ativo. Quando um usuário executa um comando. ou seja. dizemos que ele está no ³plano ativo´ (foreground). aproveitando os recursos de multi-tarefa do sistema operacional. aperte ENTER para executá-lo. execute: $ alias Gerenciamento de tarefas O bash oferece um gerenciamento de tarefas simples. em uma mesma shell. ou seja. Outro jeito de visualizar o histórico de comandos é executar: $ history E o bash lhe mostrará uma lista de comandos precedidos pelo número de sequência do comando. Escolha uma linha. se eu tenho um comando ³comando_realmente_grande -lZdsW´ mas não quero ficar digitando tudo isto. vai ser a mesma coisa que digitar todo este comando e seus parâmetros. Apelidos de comandos Os aliases. existe o plano de fundo (background). basta apenas mudar o valor da variável $HISTFILESIZE para a quantidade de comandos desejada: $ HISTFILESIZE=2000 No caso acima mudamos a quantidade de comandos guardados no histórico para 2000. ou a seta para o lado para editá-lo antes de pressionar ENTER. grave o número dessa linha e então para re-executar o comando. que permite os usuários. são um jeito fácil de criar atalhos para os comandos mais usados. Para aumentar ou diminuir este limite. Por exemplo. mas não mostra na tela e nem interage com o usuário. a ordem com que ele foi executado. Para visualizar todos os apelidos configurados para a sua atual sessão de shell. digite: $ !numero Por padrão o bash guarda 500 comandos em seu histórico. está aparecendo na tela e o usuário pode interagir com ele.

mas em plano de fundo. do jeito que você a deixou. Nele podemos ver o PATH e o visual do prompt sendo configurados. comece apertando a combinação de teclas CTRL+Z (Suspender). quando você efetuar o logoff tudo se perderá. ele parou completamente de funcionar e esperou uma ação do usuário. você terá que fazer tudo novamente« «A não ser que você utilize os arquivos de configuração e inicialização do bash. Em outras palavras. utilize o comando bg: $ bg 1 Quando suspendemos o programa. com a seguinte mensagem: [1]+ Stopped man bash Isto significa que o programa 1 desta shell foi suspendido. Em outras palavras. O conteúdo do arquivo /etc/profile contém todos os comandos padrões para todos os usuários do sistema. . O bash irá sair da tela da página de manual e voltar ao prompt. ao invés do plano ativo. Para trazer o programa de volta ao plano ativo.bash_profile dentro do diretório HOME do usuário contém os comandos de login para o usuário dono do HOME correspondente. utilize o comando fg: $ fg 1 Assim a tela da página de manual irá aparecer novamente. por exemplo. se você quiser deixar suas modificações (como variáveis e apelidos) permanentes. basta acrescentar o sinal ³&´ no final do comando. Para isso. digite: $ jobs Arquivos de configuração Muitas das coisas que aprendemos sobre o bash servem apenas para a sessão atual do usuário. O comando bg fez com que o programa voltasse a funcionar. Você pode também executar múltiplos processos dessa forma. uma vez que iniciaram uma sessão de login na shell. Já o conteúdo do arquivo . basta colocar os comandos dentro destes arquivos e os comandos serão reexecutados toda vez que você iniciar uma shell interativa.Você pode interagir pela página de manual normalmente. se você criou apelidos para comandos ou mudou o tamanho do histórico de comandos. Agora vamos suspender este programa e deixá-lo sendo executado no plano de fundo. No próximo login. Agora se quisermos executar um comando mandando-o diretamente para o plano de fundo. Para mandá-lo para o plano de fundo. assim: $ man bash & Para listar os programas que estão suspendidos ou em plano de fundo.

arquivo2. para ao invés de aparecer na tela. Se olharmos o conteúdo. O comando retornou na tela pois não especificamos nada.txt. Como a entrada padrão é o teclado. tivemos que digitar o nome do arquivo contato.txt. O sinal de ³>´ altera a saída padrão. o conteúdo do arquivo contato. . talvez possamos entender melhor.txt Neste caso. podemos lembrar que existem dois tipos principais de interfaces entre o usuário e o computador: interface de entrada (teclado. mouse) e interface de saída (monitor). Por exemplo. arquivo2. veremos que dentro do arquivo haverá várias linhas com a mesma listagem de arquivos do comando ls. quando eu digito o comando ls: $ ls arquivo1 arquivo2 arquivo3 Ele me retornou como saída na tela a lista dos arquivos: arquivo1. se eu quiser alterar a saída do comando ls anterior. enquanto o sinal de ³>>´ altera a saída padrão mas adiciona o conteúdo ao destino. Se considerarmos estes caracteres como ³redirecionadores´. o comando cat recebeu um argumento (contato. veremos a lista ³arquivo1.. perdendo todo seu conteúdo anterior. arquivo3´. Utilizando o ³>>´. se existisse o arquivo lista_de_comandos. Podemos fazer a mesma coisa com o comando cat: $ cat contato. Neste caso.txt. sobrescrevendo o destino.. ele seria sobrescrito pelo comando.txt). a saída agora é o arquivo lista_de_arquivos. a tela é a saída padrão (STDOUT e STDERR). Como utilizamos o ³>´. Para entender o funcionamento das entradas e saídas dos comandos.txt . o cat mandou para a tela (saída padrão).txt Se executarmos este comando várias vezes. podemos gravar várias linhas consecutivas sem sobrescrever os conteúdos anteriores: $ ls >> lista_de_arquivos. Por exemplo.Shell: Entrada e Saída Se voltarmos um pouco para os conhecimentos básicos da informática. basta inicialmente utilizar essa mesma definição: o teclado é a entrada padrão (STDIN). ao invés de mostrar na tela. ser gravada em um arquivo: $ ls > lista_de_arquivos.txt e por isso o comando ls vai escrever neste arquivo.. o qual podemos chamar de entrada.Informações de Contato. Recebido o argumento. Alterando a saída dos comandos Para alterar a saída dos comandos utilizamos os sinais de ³>´ e ³>>´. arquivo3..

txt não vai para nenhum lugar: nem para a tela.txt > /dev/null A informação que está dentro do arquivo contato. Por fim. vemos o STDERR em ação quando tentamos listar um arquivo que não existe: $ ls arquivonaoexistente > /dev/null ls: não foi possível acessar arquivonaoexistente: Arquivo ou diretório não encontrado Apesar de redirecionarmos a saída para ser anulada (/dev/null). Ao fazer: $ cat contato. tanto o STDOUT quanto o STDERR serão anulados. a listagem dos arquivos do comando ls. que é um dispositivo/arquivo especial que anula tudo que vai para ele. mesmo assim o ls retornou na tela a mensagem de que o arquivo não existe. a saída de erros seria direcionada para um arquivo comum chamado ³1´. ou também por ³1>´. utilizamos o sinal de ³<´. Para redirecionar o STDERR. com um sinal de ³>´. Então os dois comandos a seguir fazem a mesma coisa: $ cat contato. Como redirecionamos as duas saídas para um lugar só.txt > /dev/null $ cat contato. O STDOUT pode ser representado como estávamos fazendo anteriormente.Um uso muito comum disto é redirecionar a saída para o /dev/null. Seguindo os mesmos exemplos anteriores. Existem dois tipos de saída: STDOUT (Saída Padrão) que corresponde às mensagens normais de um comando. o comando sort ordena as linhas de um arquivo alfabeticamente e sua sintaxe é sort arquivo. também podemos simplificar o comando anterior da seguinte forma: $ ls arquivonaoexistente > /dev/null 2>&1 Vamos por partes: primeiro redirecionei a saída padrão para /dev/null (> /dev/null) e logo em seguida redirecionei a saída de erros para o mesmo lugar que a saída padrão (2>&1). por consequência. Alterando a entrada dos comandos Para alterar a entrada dos comandos. nem para um arquivo. . Corrigindo o exemplo anterior: $ ls arquivonaoexistente > /dev/null 2> /dev/null Agora sim. anulados. Se não houvesse o ³&´. pois foram redirecionados para /dev/null.txt 1> /dev/null O STDERR (Saída de Erros Padrão) corresponde às mensagens de erro que o programa gera. como por exemplo. Isto acontece porque esta é uma mensagem de erro e por isso não é contemplada pelo sinal de ³>´ ou ³1>´. O caracter especial ³&´ atuou como uma referência para a saída padrão. este comando também faz com que os dois tipos de saída sejam enviados para /dev/null e. utilizamos ³2>´. Geralmente é utilizado em comandos que necessitam de arquivos como argumentos. Por exemplo.

Podemos automatizar essa digitação colocando todos os comandos em um arquivo. seria restaurar um arquivo do banco de dados MySQL de forma automática. mas utilizado de uma forma mais crua. com o conteúdo: cd /root ls cd /usr/ ls cd /etc cat /etc/passwd cd /usr/local/bin pwd Agora podemos executar uma shell. Outro exemplo como o anterior.sql Utilizando o Pipe Além dos redirecionadores. passando como entrada este arquivo: $ bash < comandos. vamos ordenar um arquivo texto: . depois sair. que ordenará e mostrará na tela. fornece um prompt para o usuário digitar os comandos via teclado. Utilizando um exemplo parecido com os anteriores. Usase então o redirecionador de entrada para que ao invés do usuário digitar todos estes comandos. Em outras palavras. O pipe é responsável por passar a saída de um comando como a entrada de outro.sql que contém vários comandos SQL de criação de tabelas e dados. Apesar de ser útil. geralmente usamos uma forma diferente para criar shell-scripts. Nesta situação.Podemos redirecionar o conteúdo do arquivo diretamente.txt.txt. a shell bash. temos um arquivo chamado base. temos também o pipe. Por exemplo. mas bastante usado. Este é o conceito de shell-script. eles serem passados para o utilitário do MySQL: $ mysql bancodedados < base. Vamos então redirecionar essa saída para outro arquivo: $ sort < arquivo > arquivo_ordenado Outro exemplo muito comum do uso da alteração do STDIN é quando um programa necessita de sub-comandos. sem passá-lo como argumento: $ sort < arquivo Cada linha de arquivo será passada para o comando sort. ao se executar um comando. Chamaremos este arquivo de comandos. ele se torna a entrada de outro comando. quando executada.txt Ao invés do bash fornecer um prompt para a digitação de comandos. ao invés da saída dele ir para a tela ou para um arquivo. ele irá ler e executar todo o conteúdo do arquivo comandos. funcionando de forma parecida com a utilização tanto do ³>´ quanto do ³<´. representado pelo caracter ³|´.

3.txt | sort O comando cat. mas agora redirecionando o resultado para um outro arquivo: $ cat arquivo. 4. Vamos agora descobrir se um processo está sendo executado no sistema: $ ps aux | grep bash O comando ps listou todos os processos do sistema e enviou para o grep ³filtrar´ e só mostrar os que tem a palavra bash. Por fim. manda a saída para o comando sort. cada um recebendo o resultado do outro. e separa seus ³campos´. o uniq manda para a tela o resultado final: a lista dos usuários do sistema. cat /etc/passwd: Simplesmente mostra o conteúdo do arquivo /etc/passwd. se quisermos ver uma listagem detalhada de um diretório com bastante coisa.txt | sort > arquivo_ordenado. podemos utilizar os recursos de paginação do less. enviado pelo cat. Com isso. uniq: Remove linhas duplicadas. Podemos utilizar também vários pipes.txt Ou então. cut -d ³:´ -f1: Recebe o conteúdo do arquivo /etc/passwd. 2. ordenados por ordem alfabética. que ordena e joga na tela. como no exemplo: $ cat /etc/passwd | cut -d ³:´ -f1 | sort | uniq Utilizamos 4 comandos. mostrando apenas a primeira palavra de cada linha (usuário). O mesmo comando.txt na tela. . Vamos por passos: 1. sort: Organiza esses usuários em ordem alfabética. podemos facilitar a visualização combinando a listagem e o comando less: $ ls -lha /usr/bin | less Ao listar todos os arquivos do diretório /usr/bin. ao invés de mostrar o conteúdo de arquivo.$ cat arquivo. o ls manda o resultado para o less.

d $ pwd /etc/rc. usa-se a / antes. Em sistemas operacionais como o Linux. Alguns destes ³atalhos´: . exemplo: $ pwd /usr/local/bin $ cd /etc/rc. cd ± Navegando entre diretórios Sintaxe: $ cd [nome_do_diretório] Muda o diretório atual..(hífen) Diretório atual Diretório HOME do usuário Raiz do sistema Último diretório (Voltar) . Neste caso utilizamos o ~ que é uma espécie de atalho para o diretório HOME do usuário.Comandos para Manipulação de Arquivos Uma das coisas essenciais ao usar um sistema operacional é saber como lidar os arquivos e diretórios dentro dele. Exemplos: $ pwd /usr/games $ cd ~ $ pwd /home/eitch No exemplo acima. estávamos no diretório /usr/games e com um simples cd para o diretório ~. fomos para o diretório HOME (/home/eitch). (ponto) ~ (til) / (barra) . pwd ± Exibe o diretório atual Sintaxe: $ pwd Mostra de forma simples em qual diretório o usuário está localizado no momento. mexer com arquivos é essencialmente tudo o que você vai fazer ao configurar o sistema e seus serviços.d $ cd $ pwd /usr/local/bin . (dois pontos) Diretório anterior (um nível acima) Se você deseja ir para um diretório que está na raiz diretamente.

ao contrário dos outros arquivos que não contém nenhuma letra (-) e por isso são arquivos comuns. $ cd /home ls ± Listar arquivos Sintaxe: $ ls [opções] [arquivo/diretório] Lista os arquivos e diretórios. Podemos ver acima que a segunda linha (diretorio) inicia com a letra d. Em outras palavras. o que significa que ele é um diretório. ou seja. caracteres que substituem outros.txt . quer dizer que estamos especificando um caminho relativo.) -h Exibe o tamanho num formato legível (combine com -l) -R Lista também os subdiretórios encontrados Exemplo de uma listagem detalhada: $ ls -l total 9916 drwxrwxr-x -rw-r--r--rw-r--r--rw-r--r-- 5 1 1 1 hugo hugo hugo hugo hugo 1302 Aug hugo 122631 Jul hugo 2172065 Jul hugo 2023315 Jul 16 12 12 12 10:15 08:20 08:20 08:20 diretorio Database. os dois comandos a seguir farão a mesma coisa. especificamos o caminho absoluto do diretório.. Há também alguns parâmetros extras: -l Lista os arquivos em formato detalhado.pdf No exemplo acima. listar todos os arquivos que têm a extensão .Ao utilizar uma barra antes do diretório. ou seja. Se executarmos apenas o comando ls sozinho.pdf PHP. grupo dono. todo o seu caminho desde a raiz. usuário dono.pdf MySQL. número de hard links. se eu estou no diretório /home/eitch.txt: $ ls *. d para diretório. p para um FIFO. Podemos também usar no ls o que chamamos de wildcards (caracteres coringa). Estas informações são separadas por um ou mais espaços (para uma melhor formatação) e apresentam os seguintes dados: tipo de arquivo e permissões. de acordo com o diretório atual. ou seja. Exemplo. tamanho. -a Lista os arquivos ocultos (que começam com um . É possível identificar o tipo de arquivo desta maneira e as letras podem ser: b para arquivo especial de bloco. data de modificação e por último o nome do arquivo. c para arquivo especial de caracter. os arquivos e diretórios são listados com outras informações antes de seus nomes. ele mostrará todos os arquivos existentes no diretório atual. só que um usando o caminho relativo e o outro o caminho absoluto: $ cd . l para link simbólico. s para socket. Se não colocamos a barra para especificar a raíz.

temos: -i Modo interativo.txt livro.txt O wildcard neste caso é o ³*´.txt sis.txt Ou ainda os colchetes.txt manual2.txt mouse. Exemplo.txt manual7.txt manual4. criar um diretório dentro do HOME do usuário: $ mkdir ~/paginas rmdir ± Remove um diretório vazio Sintaxe: $ rmdir <nome_do_diretorio> Apaga um diretório que esteja vazio.txt manual1. cp ± Cópia de arquivos e diretórios Sintaxe: $ cp [opções] <arquivo_origem> <arquivo_destino> Copia arquivos e diretórios.txt para livro. apagando o diretório /tmp/lixo apenas se ele estiver vazio: $ rmdir /tmp/lixo Para apagar um diretório com seu conteúdo. usa-se o comando rm.txt . -R Copia recursivamente (diretórios e subdiretórios) Exemplo.txt manual6.txt manualito. Como parâmetros.txt rede.txt manual3. com a opção de modo interativo: $ cp -i brasil.txt manualx.txt ipfw.txt manual3.txt.txt placa_de_video.txt seguranca.debian-install. Existem outros wildcards.txt named.txt. copiando o arquivo brasil.txt mkdir ± Cria um diretório Sintaxe: $ mkdir <nome_do_diretório> Cria um diretório. Pergunta se você quer sobrescrever ou não (confirmações) -v Mostra o que está sendo copiado. que substituem uma faixa de caracteres: $ ls manual[3 -7]. como por exemplo o ponto de interrogação ³?´. Exemplo: $ ls manual?.txt plip. que representa ³tudo´. Exemplo. que substitui apenas 1 caractere.txt manualP.

Em seu uso mais simples.txt: $ mv industria. Ele remove um diretório e todo seu conteúdo sem perguntar.bin Para apagar um diretório com todo seu conteúdo. procurar o arquivo nota.cp: sobrescrever `livro. última modificação.tx t /home/usuario rm ± Remove arquivos e diretórios Sintaxe: $ rm [opções] <arquivo> Este comando apaga definitivamente o arquivo ou diretório. Por exemplo. fazer isso na raiz não seria uma boa idéia. entre outros. Exemplo.txt já existia.txt para /home/usuario com o mesmo nome: $ mv industria. use-o com cuidado.txt para fabrica.txt dentro do diretório /home/eitch: .txt fabrica. Copiar o diretório /home/ftp e todo seu conteúdo (incluindo seus subdiretórios) para /home/ftp2: $ cp -R /home/ftp /home/ftp2 mv ± Move arquivos e diretórios Sintaxe: $mv <arquivo_origem> <arquivo_destino > Move um arquivo para outro lugar. o comando pergunta se quer sobrescrever.txt'? Como o arquivo livro. Exemplo. mas pode também procurar por tipos.txt Mover o arquivo industria. Exemplo: $ rm arquivo. renomear o arquivo industria. find ± Procura arquivos Sintaxe: $ find <diretorio> [ -name nomedoarquivo] Procura por arquivos no diretório especificado. permissões. responda y (sim) ou n (não). ele procura pelos nomes dos arquivos. Ele também é usado para renomear um arquivo. usa-se a opção -r: $ rm -r /tmp/lixo Cuidado! O comando ³rm -rf´ é muito perigoso.

procurar por todos os arquivos que começam com o nome de documento e terminam com . Através desta opção você pode executar comandos para cada um dos arquivos encontrados. Ou até remover os diretórios que tem . ln ± Cria links entre arquivos Sintaxe: $ ln -s <arquivo_origem> [link simbólico] Usado para gerar links simbólicos. a opção -exec. Exemplo: Criar um link em /tmp/apostila-linux. ou seja. foi executado o comando chmod 755 <arquivo encontrado>.odp O find também conta com uma opção muito útil. eu quero remover todos os arquivos que terminam com a extensão .odp: $ find /home/eitch -name documento*.exe -exec rm -f {} \. para definir permissões ³755 para todos os diretórios: $ find /home/eitch -type d -exec chmod 755 {} \. agora para definir permissões ³644 para arquivos: $ find /home/eitch -type f -exec chmod 644 {} \. Combinando com as outras opções. O ³{}´ no comando é substituído por cada arquivo ou diretório encontrado. links que se comportam como um arquivo ou diretório. se torna um poderoso utilitário! Por exemplo.txt -print Procurar por todos os diretórios dentro do /etc: $ find /etc -type d -print Procurar por todos os arquivos que foram modificados nos últimos 2 dias: $ find / -mtime 2 -print Procurar por arquivos que podem ser escritos por todo mundo: $ find / -perm -222 Os wildcards também podem ser usados. é apenas o ³terminador´ para o comando do -exec.svn como nome: $ find /home/eitch/projeto -type d -name . por exemplo.exe: $ find /h ome/eitch -type f -name *.$ find /home/eitch -name nota. O mesmo exemplo. apontando para o diretório /apostila: . mas são apenas redirecionadores que mandam seu comando para outro arquivo ou diretório.svn -exec rm -rf {} \. Neste exemplo. para cada diretório encontrado (-type d) dentro do /home/eitch. O \. Ou então.

Os caracteres especiais de redirecionadores são utilizados para este fim.devin.au > /dev/audio Os redirecionadores podem ser utilizados em todos os outros comandos na shell.br O cat também pode servir como redirecionador para outro arquivo. isso seria equivalente a fazer uma cópia do arquivo: $ cat contato1 > contato2 O ³>>´ acrescenta a saída de um comando à um arquivo. Exemplo: Mostrar o conteúdo de /home/eitch/contato: $ cat /home/eitch/contato Hugo Cisneiros hugo@devin.$ ln -s /apostila /tmp/apostila -linux Também é utilizado para criar links físicos (hard-links). mas como um arquivo apontando para um mesmo lugar no disco e funciona apenas em arquivos. primeiro gravamos com um microfone o som: $ cat gravacao. Um link físico funciona não como um atalho.au < /dev/audio O comando acima direcionou o dispositivo de som ³no caso. ou faz uma cópia deste arquivo. mantendo seu conteúdo anterior: $ cat contato1 >> contato3 Um outro exemplo divertido é tocar sons com o cat. Exemplo: $ ln arquivo linkdoarquivo cat ± Exibe o conteúdo de um arquivo Sintaxe: $ cat <arquivo> Mostra o conteúdo de um arquivo. Como o comando cat mostra exatamente o conteúdo de um arquivo.com. Agora escute o som gravado com o comando: $ cat gravacao. só pode ser utilizado em uma mesma partição.au. .br http://www. O ³>´ redireciona a saída de um comando para um arquivo.com. Redirecionando o conteúdo de um arquivo para o dispositivo de som reproduz o som pelos alto-falantes e vice-versa. a captura por microfone´ para o arquivo gravacao. ou uma junção. Por depender de uma posição física no disco. Para testar este caso.

continua mostrando as linhas na medida que o arquivo é atualizado. Exemplo: # tail -f /var/log/httpd/access_log more. file ± Indica o tipo de arquivo . O comando a seguir mostrará as 50 últimas linhas do arquivo /var/log/messages: # tail -n 50 /var/log/messages Quanto utilizado com o parâmetro -f. mostra o começo de um arquivo.head. Por exemplo. criam uma espécie de paginação. o comando /pesquisa para pesquisar por uma palavra no documento e a tecla q para sair. No less. a visualização das páginas de manual é feita com o less): é possível utilizar as setas para navegar no documento para cima e para baixo. até quando o fim do arquivo chega e o o comando finaliza. mas ao invés de jogarem todo o conteúdo na tela de uma vez só. o comando tail mostra as linhas mas não para. utilizar as teclas PgUp e PgDown para paginar. a paginação funciona como em uma página de manual (na verdade. ambos comandos mostram as 10 linhas correspondentes. podemos especificar a quantidade de linhas. less ± Visualiza arquivos por páginas Sintaxe: $ more <ar quivo> Sintaxe: $ less <arquivo> Parecidos com o cat. Por padrão. exibindo as 10 últimas linhas do arquivo /var/log/messages: # tail /var/log/messages Ou as 10 primeiras linhas do /etc/profile: $ head /etc/profile Quando utilizado o parâmetro -n. as vezes é necessário apenas visualizar parte dele. O comando tail (calda) mostra o final de um arquivo. Em arquivos de log por exemplo. No comando more. visualizar o final para ver os últimos acontecimentos é uma prática comum. tail ± Mostra o começo e fim do arquivo Sintaxe: $ head [opções] <arquivo> Sintaxe: $ tail [opções] <arquivo> Talvez pelo arquivo poder ser muito grande. O comando head. Útil para visualizar logs em constante atualização. a tecla ESPAÇO vai passando as páginas. como o nome diz (cabeçalho). ao invés de 10.

O comando touch muda estes valores. Sem argumentos. Exemplo: $ file linux. o sistema de arquivos reserva para ele algumas informações que chamamos de timestamps: hora do último acesso e hora da última modificação. . Bourn-again shell-script. ELFExecutable. data.txt ASCII Text touch ± Muda timestamps Sintaxe: $ touch [opções] <arquivo> Quando um arquivo é criado. Este parece ser o método preferido de criação de arquivos vazios. Há varios tipos de retorno. JPEG Image File. o touch muda os dois atributos para a hora atual. entre outros.Sintaxe: $ file <arquivo> Identifica o tipo de arquivo ou diretório indicado pelo usuário conforme os padrões do sistema operacional. C Program source. o comando cria um novo arquivo vazio. exemplos: ASCII text. Quando não existe o arquivo. directory.

Se você já instalou algum Linux. ele pode fazer TUDO em seu sistema. No caso do ³adduser´ ser um comando mesmo. ou seja. Uma primeira coisa que possamos dizer é que o Linux não pode de alguma maneira ser usada sem estar sendo um usuário. e depois com o comando ³passwd´. e é ele quem você vai usar primeiro para criar outros usuários depois (a não ser que você tenha criado um usuário comum durante a instalação do seu Linux). Com as informações que vou lhe dar aqui. então você se pergunta: ³Como?´ Há um comando específico para isto. Você pode especificar outros parâmetros para o usuário. Este comando é o ³adduser´ ou ³useradd´. o Linux é um sistema multi-usuário. como no comando a seguir: adduser hugo -d /var/usuarios/hugo -s /dev/null Com estes parâmetros. ele faz. o comando ³adduser´ vai ser apenas um comando igual ao ³useradd´. Antes de mais nada. não terá shell). ou então um script interativo que irá lhe fazendo perguntas. Sem estes parâmetros. ou qualquer coisa do tipo. você irá preenchendo. Dependendo da distribuição. Vamos entender agora como este comando funciona. Vou pegar um exemplo para vocês: hugo:x:1001:100:Hugo Cisneiros:/home/hugo:/bin/bash . você poderá utilizar assim: adduser hugo passwd hugo Isso respectivamente irá criar um usuário padrão chamado hugo. você verá que a primeira coisa que você irá fazer antes de usar o sistema é se logar como root.Manipulação de Usuários Como você já deve saber. você definirá uma senha para este usuário. especifiquei que o usuário hugo terá como diretório home o ³/var/usuarios/hugo´ e como shell o ³/dev/null´ (ou seja. então. então vamos aprender a montar cada linha desta. fique sabendo que o root é um usuário especial. que têm restrições. O passwd é formado por linhas onde cada linha é um usuário. Cada um desses programas escrevem o usuário no arquivo de configuração do Linux referente aos usuários do sistema. Cada linha deste arquivo é um usuário cadastrado no sistema. é claro que não só pode existir um usuário usando o sistema. que é uma coisa essencial que todos deveriam saber em relação ao sistema Linux. Este arquivo é o ³/etc/passwd´. O usuário µroot¶ é o administrador do sistema. Mas aí por alguma razão você quer mudar de usuário. Ao contrário dos usuários comuns. você pode muito bem criar uma conta sem usar estes programas/scripts citados acima. como falei acima. ou criar outro. o diretório home seria ³/home/hugo´ e o shell seria ³/bin/bash´. preencher aquele campo login: com o usuário root. não importa o que acontecer. e então o script criará um usuário no sistema para você.

ser da plebe :) E se for precisar usar o root. telefone. o deus do sistema. etc. como nome. e se estivesse sem nada (::). você pode apagar a linha referente a ele no /etc/passwd e os seus arquivos. aprendi sobre adicionar um usuário. Outra dica: Não é muito bom ficar usando o usuário root. a conta não teria password. Outro arquivo que tem muito haver com os usuários no Linux é o /etc/group. Obs: O /etc/shadow é um arquivo que contém a senha do usuário criptografada. Ahhhhh? Você quer mais? O quê? Quer deixar um usuário como se fosse root? Então vamos lá que não temos nada a perder! O root possui o UID e o GID igual à 0 (zero). Comentários do usuário. se alguém tiver posse dela. e usuários adicionais que pertencem à ele. etc O diretório HOME do usuário. Você adicionando uma linha neste arquivo estará criando um novo grupo. e pode descobrir as senhas dos usuários. olhe só: Campo hugo x 1001 100 Hugo Cisneiros /home/hugo /bin/bash Significado Login do Usuário. legal. o número de identificação do usuário. Aqui diz que o password está no arquivo /etc/shadow. ou simplesmente digitar userdel usuario. Se nós forçássemos a mudança do UID e GID de um usuário para 0. aqui você pode colocar o nome que quiser com até 8 caracteres. o administrador do sistema. o programa que irá enterpretar os comandos que o usuário executar. onde cada um é separado por : (dois pontos). ele ficaria como se fosse o root! Por exemplo.Vamos dividir esta linha em ³campos´. este usuário é somente para a administração do sistema. o usuário hugo vai ser também o root do sistema. Shell do usuário. Combine com a opção -r para deletar junto o diretório HOME do usuário. o número de identificação do grupo do usuário. Que contém as definições de cada grupo. Felizmente este arquivo está muito bem protegido pelo sistema :) Bem. então eu recomendo à você a usar sempre um usuário normal. a conta estaria desabilitada. esta pessoa pode muito bem comparar as senhas com uma lista de palavras. GID (Group IDentification). como por exemplo seus nomes. eu tenho a linha do usuário no /etc/passwd e mudo: hugo:x:1001:100:Hugo Cisneiros:/home/hugo:/bin/bash hugo:x:0:0:Hugo Cisneiros:/home/hugo:/bin/bash ^ ^ Pronto. GIDs. ou seja. logar como ele ou utilizar o comando ³su -´ para se tornar o próprio root. mas como faço para removê-lo? Simples. Vamos criar aqui um novo grupo no /etc/group: . UID (User IDentification). Se estivesse *. e um usuário comum não.

combinando este conhecimento com algo sobre permissões dos arquivos. quais seus diretórios. eitch¶. que arquivos podem acessar. µhugo. você pode controlar muito bem quem usa o seu sistema ou servidor. dizendo quem pertence à que grupo.metal:x:666:hugo. entre outros. um novo grupo é criado: com o nome µmetal¶. Bom proveito! . jim. o GID µ666 e como usuários adicionais pertencentes à ele.eitch Adicionando esta linha acima no arquivo /etc/group.jim. Fácil não? Bem é isso.

significa que não há essa permissão. Todos os outros podem ler. quando há um ³-´ no lugar da letra. os próximos 9 caracteres são uma sequência de permissões. Vejamos agora o exemplo do diretório apostila: drwxr-xr-x 2 coletivo coletivo 4096 2008 -08-29 13:35 apostila Neste caso. Em outras palavras. escrever e executar o arquivo. arquivos e diretórios têm de pertencer à um certo usuário e grupo. apenas o usuário dono (root) pode entrar e mexer nele. Outro exemplo: . escrever e executar o arquivo. propriedades que restringem o seu uso. além de seu nome e conteúdo. Todos os outros podem ler e executar. O oposto disto seria a combinação ³²²²´. Podemos dizer que temos 3 variações de letras: y y y Letra r ± leitura (read) Letra w ± escrita (write) Letra x ± execução (execute) Estas três letras se encaixam em 3 campos: {rwx}{rwx}{rwx} y y y Campo 1: Permissões do usuário dono Campo 2: Permissões do grupo dono Campo 3: Permissões para todos os outros Sendo assim. O comando ls -l mostra uma listagem detalhada dos arquivos do diretório atual e isso inclui suas permissões. Este tipo de funcionalidade é essencial em um sistema multi-usuário real. Como o Linux é um sistema operacional multi-usuário. Então podemos ler a linha da seguinte forma: O usuário dono (coletivo) pode ler. mas não podem escrever. O grupo dono pode ler. O diretório /root por exemplo pertence ao usuário root e grupo root. Vejamos um exemplo: $ ls -l drwxr-xr-x 2 coletivo coletivo 4096 2008 -08-29 13:35 apo stila Na parte do comando ls aprendemos que depois do primeiro caracter (tipo de arquivo). mas não pode escrever. escrever e executar. O grupo dono (coletivo) pode ler e executar. todos podem fazer tudo no arquivo. escrever e executar o arquivo.Permissões Permissões de Acesso Todo arquivo ou diretório tem. o exemplo rwxrwxrwx significa literalmente: O usuário dono pode ler. Devido às permissões deste diretório.

O grupo dono (audio) pode ler e escrever no arquivo. mas não pode executar. Se criarmos um arquivo com o usuário coletivo.$ ls -l /dev/dsp crw-rw---. mas não pode executar.1 root cdrom 3. Modificando as permissões . não podem escrever e nem executá-los. não podem escrever e nem executá-lo. especificado no comando através do grupo precedido por um ponto. O grupo dono (cdrom) pode ler e escrever. em um comando só. o usuário dono e o grupo dono serão os do usuário coletivo. mas não pode executá-lo. seria: # chown root. Modificando os donos Ao utilizar o ls -l. 0 2008 -08-29 07:57 /dev/hda Ou seja. Podemos modificar quem é o dono do arquivo através dos comandos chown (change ownership ± mudar o usuário dono) e chgrp (change group ± mudar o grupo dono). O usuário dono (root) pode ler e escrever neste arquivo.1 root audio 14. Isto quer dizer que as permissões estarão sempre rwxrwxrwx e o que vale na verdade são as permissões do arquivo hda: $ ls -l /dev/hda brw-rw---. podemos ver o usuário dono e o grupo dono dos arquivos e diretórios. Os outros não podem ler.root coletivo O comando chown também modifica o grupo dono. Todos os outros não podem ler. mas não pode executá-lo. lembrando que apenas o usuário root pode fazer isto. 3 2008 -08-29 07:57 /dev/dsp O arquivo /dev/dsp é do tipo ³arquivo especial de caracter´ (c). Utilizando o comando chown para modificar usuário dono e grupo dono: # ls -l drwxr-xr-x 4 coletivo coletivo 4096 2008 -08-29 13:35 coletivo # chown root coletivo # chgrp root coletivo # ls -l drwxr-xr-x 4 root root 4096 2008 -08-29 13:35 coletivo Um jeito mais simples de fazer a mesma coisa. tanto para o arquivo /dev/cdrom. Um outro exemplo: $ ls -l /dev/cdrom lrwxrwxrwx 1 root root 3 2008 -08-29 07:57 /dev/cdrom -> hda A primeira letra indica que o arquivo /dev/cdrom é um link simbólico para /dev/hda. quanto para o arquivo /dev/hda: O usuário dono (root) pode ler e escrever.

g para grupo e o para outros. o número 3 significa permissão de escrita e execução (1 + 2 = 3). cada um especificando os campos de usuário dono. utilizamos 3 números junto ao comando chmod. Outro exemplo: . os sinais de ³+´ e ³-´. grupo. grupo dono e outros: $ chmod 755 arquivo $ ls -l arquivo -rwxr-xr-x 1 coletivo coletivo 0 2008 -08-29 14:14 arquivo O usuário dono (coletivo) pode ler. escrita e execução) é representado por um número. Exemplo: $ chmod o+r arquivo $ ls -l arquivo -rw-rw-r-. pedimos ao chmod que adicionasse apenas a permissão de leitura para os outros (o+r). cada tipo de permissão (leitura. Agora vamos remover apenas o bit de escrita do grupo dono (g-r): $ chmod g -w arquivo $ ls -l arquivo -rw-r--r-.o= arquivo $ ls -l arquivo -rw-rw---. Por exemplo.1 coletivo coletivo 0 2008 -08-29 14:14 arquivo Ao invés de especificarmos cada campo (usuário.Existem duas maneiras de se modificar as permissões com o comando chmod: a forma extendida e a forma octal. O número 5 significa permissão de leitura e execução (1 + 4 = 5). outros).g=rw. o grupo dono pode ler e escrever (g=rw) e os outros não podem fazer nada (o=). requer um pouco mais de raciocínio. Na forma extendida. para atribuir permissões relativamente.1 coletivo coletivo 0 2008 -08-29 14:14 arquivo A forma octal de representação das permissões. Nesta forma. a soma dos números nos dará a combinação de atributos desejada. apesar de ser mais rápida. Exemplo: $ chmod u=rw.1 coletivo coletivo 0 2008 -08-29 14:14 arquivo Desta forma especificamos que o usuário dono (coletivo) pode ler e escrever (u=rw). Apenas o usuário root pode modificar as permissões de outros usuários. na seguinte ordem: y y y Número 1 ± Execução Número 2 ± Escrita Número 4 ± Leitura Pensando em forma binária. escrever e executar (1 + 2 + 4 = 7). especificamos u para usuário. Podemos também utilizar ao invés do sinal ³=´. O grupo dono (coletivo) pode ler e executar (1 + 4 = 5). Sabendo disto. A modificação de permissões pode ser feita contanto que o usuário seja o dono do arquivo. Os outros podem ler e executar (1 + 4 = 5).

Outro exemplo: $ chmod 600 arquivo $ ls -l arquivo -rw------. sem a intervenção do usuário root. Bits especiais Além das permissões de leitura. Um exemplo de aplicação que possui (e precisa) de SUID é o /usr/bin/passwd: o comando que muda a senha dos usuários. O arquivo de usuários e senhas do sistema tem permissões para que apenas o root possa ler. Os outros podem apenas ler (4). quer dizer que está com SUID. terá privilégios de root. faz com que todo usuário que executar este arquivo se transforme no usuário dono do arquivo durante a execução. como ele poderia ler e modificar o arquivo de senhas se as permissões não deixam? Quando o usuário executa o /usr/bin/passwd. Vejamos as permissões do exemplo: $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 30968 2008 -04-02 20:57 /usr/bin/passwd Podemos ver que há uma letra incomum nas permissões: o s. Quando em maiúsculo. o programa também tem permissão de executável (x). Este tipo de permissão deve ser sempre evitado. indica que apenas o SUID está ativo. pois se um programa do root tiver alguma falha de segurança e estiver com o SUID habilitado. Neste caso. escrita e execução. qualquer usuário ao executar este programa. O grupo dono (coletivo) pode apenas ler (4). Isto quer dizer que se um programa estiver com permissão de root e com o SUID ativado. então é como se o usuário virasse o root temporariamente e por isso ele poderá ler o arquivo de senhas. o comando está com permissão de SUID. Use apenas quando realmente precisar. qualquer usuário poderia se tornar o root e conseguir poder total no sistema.1 coletivo coletivo 0 2008 -08-29 14:14 arquivo O usuário dono (coletivo) pode ler e escrever (2 + 4 = 6).$ chmod 644 arquivo $ ls -l arquivo -rw-r--r-. Quando o s está no campo de permissões ao usuário dono. mas se um usuário normal quiser mudar a sua senha diretamente. indica que além do SUID. temos também três outros bits especiais de permissões que podemos usar: SUID Quando utilizado em um arquivo.1 coletivo coletivo 0 2008 -08-29 14:14 arquivo Apenas o usuário dono (coletivo) pode ler e escrever (2 + 4 = 6). o usuário estaria limitado a fazer apenas o que o programa /usr/bin/passwd permite: mudar senhas. Quando o s está minúsculo. Adicionando e removendo o SUID de um arquivo: .

Quando utilizado em diretórios. Exemplo: $ ls -ld apostila drwxr-xr-x 2 coletivo coletivo 4096 2008 -08-29 13:35 apostila $ chmod g+s apostila $ ls -ld apostila drwxr-sr-x 2 coletivo coletivo 4096 2008 -08-29 13:35 apostila # cd apostila # touch teste # ls -l teste -rw-r--r-. O SUID precisaria ser colocado na shell (o que não é nem um pouco recomendável). Quando um arquivo ou diretório está com SGID. independente do usuário que estiver executando.$ ls -l arquivo -rwxr-xr-x 1 coletivo coletivo 0 2008 -08-30 12:42 arquivo $ chmod u+s arquivo $ ls -l arquivo -rwsr-xr-x 1 coletivo coletivo 0 2008 -08-30 12:42 arquivo $ chmod u -s arquivo $ ls -l arquivo -rwxr-xr-x 1 coletivo coletivo 0 2008 -08-30 12:42 arquivo O SUID funciona apenas em executáveis. não funcionando em scripts shell.1 root coletivo 0 2008 -08-30 12:50 teste Ao configurar o SGID no diretório apostila. o executável na verdade é o interpretador de comandos (a shell) e não o script. Quando o root criou um arquivo vazio chamado teste. apenas em executáveis. a execução acontece como se o grupo dono fosse o mesmo do arquivo. assim como o SUID. Isto é bastante usado em diretórios compartilhados. o ls -l irá mostrar a letra s (em maiúsculo ou minúsculo. Em um script shell. mas isto hoje em dia é completamente ignorado. também não funciona diretamente em scripts. o usuário coletivo forçou que qualquer usuário que criasse um arquivo dentro deste diretório o criaria como grupo-dono coletivo. mas só podem remover seus próprios arquivos e não os dos outros usuários também. faz com que apenas o dono do arquivo e o dono do diretório possam remover o seu conteúdo. onde qualquer pessoa pode criar arquivos. que nem o SUID) na posição do campo do grupo. funciona como o SUID: quando executado por qualquer usuário. . quando aplicado em um arquivo. Isto é utilizado em diretórios temporários como o /tmp. o SGID faz com que todos os arquivos criados tenham como grupo dono o grupo do diretório com o SGID. dizia ao sistema operacional que a execução deste arquivo não poderia utilizar a memória RAM do sistema. SGID Para arquivos. Quando aplicado em um diretório. podemos ver que realmente o grupo deste arquivo ficou como coletivo. Sticky Em tempos passados. O SGID.

Porém. Mas também há a forma octal. não precisamos configurar suas permissões. escrita e execução: cada bit é representado por um número e a soma destes números permite uma combinação de permissões especiais: y y y Número 1 ± Sticky Número 2 ± SGID Número 4 ± SUID O resultado destes números precedem os outros três números no comando chmod. . O umask é um comando e funciona especificando uma máscara de permissões tanto em uma forma extendida quanto na forma octal. $ chmod 3755 apostila $ ls -ld apostila drwxr-sr-t 2 coletivo coletivo 4096 2008 -08-30 13:05 apostila Os bits de Sticky e SGID foram adicionados neste diretório (1 + 2 = 3). a máscara de permissões. $ chmod 6755 arquivo $ ls -l arquivo -rwsr-sr-x 1 coletivo coletivo 0 2008 -08-30 13:05 arquivo Os bits de SUID e SGID foram adicionados neste arquivo (2 + 4 = 6). no lugar do x. Exemplo: $ ls -ld /tmp drwxrwxrwt 11 root root 4096 2008 -08-30 07:35 /tmp Todos os usuários do sistema podem listar o conteúdo.O Sticky é representado pela letra t no terceiro campo de permissões: outros. como existe o Sticky bit. Exemplo: $ chmod 4755 arquivo $ ls -l arquivo -rwsr-xr-x 1 coletivo coletivo 0 2008 -08-30 13:05 arquivo Além das permissões normais (755). apagar arquivos e entrar no diretório. que funciona da mesma maneira que os bits de leitura. Esta característica é conhecida pela definição ³umask´. criar. o SUID foi adicionado neste arquivo através do número 4. estes usuários só poderão apagar seus próprios arquivos. Forma Octal dos Bits Especiais Vimos as formas extendidas de se configurar os bits especiais. Máscara padrão de permissões Toda vez que criamos um arquivo. parecido com o comportamento do comando chmod.

sabemos que o umask é geralmente definido no arquivo /etc/profile. Então no caso da umask 0022. todos os números -1: 644. No caso do bash. Outra forma mais fácil de entender é utilizando o parâmetro -S: $ umask -S u=rwx. Para visualizar a atual configuração do umask. digite: $ umask 0022 Agora comece com os valores: 666 para arquivos e 777 para diretórios. os arquivos terão permissão padrão 644 e os diretórios terão 755.o=rx Que significa 755. escrita e execução) do umask subtrai destes valores.Por ser um comando da shell. ou no caso de um arquivo.g=rx. . O valor das permissões normais (leitura. o umask é definido nos scripts de inicialização dessa shell.

o tópico Variáveis Especiais nos traz os primeiros itens que devemos aprender para o tratamento de argumentos. Ou seja. O resto das linhas. Mas isso nunca impediu que se criasse também programas completos em shell-script. etc) $* ± Retorna todos os argumentos de uma vez. 10 a 14. Uma característica para deixar um shell-script mais robusto e menos ³sequencial/batchmode´ é o tratamento de argumentos. especializadas. No meu clássico tutorial Programando em ShellScript. ele imprime um erro e sai do programa com status 1. (argc) Vejamos agora um shell-script exempo que faz uso de todos esses argumentos: ? 01 02#!/bin/bash 03 04if [ $# -lt 1 ]. Existem variáveis especiais que tratam os argumentos passados para um programa ou uma função.Shell Script: tratamento de argumentos e opções Na grande maioria das vezes. 11for COUNT=`expr do $COUNT + 1` 12 echo "Argumento $COUNT: $ARG" 13done 14 As linhas 3 a 6 verificam se a quantidade de argumentos ($#) é menor (-lt ± less than) que 1. Nisso. then echo "Faltou utilizar pelo menos um argumento!" 05 exit 1 06fi 07 08echo "Numero de argumentos: $#" 09 10COUNT=0 ARG in $*. ela é extremamente eficiente e rápida. 2 = segundo argumento. A linha 8 mostra quantos argumentos foram utilizados. $# ± Retorna a quantidade de argumentos passado para o script. Estes são: y y y y $0 ± Retorna o nome do script que foi executado $N ± Onde N é um número. e que quando se juntam realizam grandes feitos trabalhando juntas. usam o $* com um laço for e um contador para mostrar quais foram os argumentos. corresponde ao argumento passado (1 = primeiro argumento. 3 = terceiro argumento. usando novamente o $#. Combinar comandos é uma grande vantagem que o jeito UNIX de ser nos trouxe: várias ferramentas que fazem tarefas básicas. . se o usuário não chamou o programa com nenhum argumento. a linguagem shell-script é usada para criar uma sequência de comandos que automatizam uma tarefa.

/tmp. ativar durante o programa o modo de depuração." . Do tipo: Se a opção -d existir.sh naosei testando Numero de argumentos: 2 Argumento 1: naosei Argumento 2: testando E agora com 4 argumentos: $ ./tmp. 08 *) echo "Opcao invalida!" exit 1 09 ... 10 esac 11 Exemplos do uso do script: $ .Executando agora este script sem argumentos: $ . então mostre uma ajuda e não faça mais nada. Opções não deixam de ser argumentos para um programa. mas eles tem um significado especial. . Se houver um -v mostre a versão./tmp.. 06 "-v") echo "Versao 666./tmp. $ .sh a b c d Numero de argumentos: 4 Argumento 1: a Argumento 2: b Argumento 3: c Argumento 4: d Bem simples né? Argumentos como opções e seus valores Algo comum que vemos nos programas são opções.sh -v Versao 666... e por aí vai. Mas fiquei com preguiça de escrevela." 07 ..sh Faltou utilizar pelo menos um argumento! Agora executando com dois argumentos: $ . Se houver um -h. Mas fiquei com preguiça de 04 05escrevela./tmp.. Exemplo: ? 01#!/bin/bash 02 03case $1 in "-h") echo "Isto seria uma ajuda.sh -h Isto seria uma ajuda.

mostra a ajuda e sai do programa. mostra o resultado do comando ³swap -s´ Note que apenas as opções -h e -v saem do programa após a execução.log´ gravaria um arquivo de log com as operações./tmp. Agora vamos ao código: ? 01#!/bin/bash 02 function PrintUsage() { 03 echo "Uso: `basename $0` < -umsf> [-ohv]" 04 exit 1 05} 06 07while getopts "hvo:umsf" OPTION 08do case $OPTION in 09 h) PrintUsage 10 . E se uma das opções precisasse de um valor? Estilo ³-f arquivo. grava um arquivo de log com as operações efetuadas e resultados.. v) echo "`basename $0` versao 666.sh -O Opcao invalida! $ . utilizasse as opções« Mas felizmente não precisamos fazer nada disso! O bash conta com uma função interna que trata os argumentos: o famoso getopts. Supondo que queiramos um shell-script que faça isso: y y y y y y Caso a opção -h seja usada. testasse se fosse um ou outro.. Caso a opção -o <arquivo> seja usada. Caso a opção -u seja usada.. mostra a versão e sai do programa. Utilizando o getopts para tratar tratar argumentos e opções Seguindo a mesma linha de raciocínio. ./tmp. vamos logo para um exemplo de programa." 11 exit 12 .$ . 13 o) ARQUIVO_LOG=$OPTARG 14 . Poderíamos escrever vários algoritmos que verificassem cada um de todos os argumentos. Caso a opção -v seja usada. mostra o resultado do comando ³uname -a´ Caso a opção -m seja usada.sh Opcao invalida! Com isso a gente resolve um problema e cria mais outros dois« y y E se o usuário colocar as duas opções? Só uma funcionaria. mostra o resultado do comando ³free -m´ Caso a opção -s seja usada.

. then PrintUsage 27fi 28 29if [ "$ARQUIVO_LOG" ]. then echo "Execucao iniciada em `date`. then 50 swapon -s 51 fi 52fi 53 54 55 56 57 58 59 60 O interessante para nós são as linhas 8 a 28. . then 32 uname -a >> $ARQUIVO_LOG 33 fi 34 35 if [ "$DO_FREE" == 1 ]. then 36 free -m >> $ARQUIVO_LOG 37 fi 38 if [ "$DO_SWAPON" == 1 ]. ele coloca a letra da opção na variável $OPTION. then 47 free -m 48 fi 49 if [ "$DO_SWAPON" == 1 ]. 21 esac 22done 23shift $((OPTIND -1)) 24 25if [ -z "$DO_UNAME" ] && [ -z "$DO_FREE" ] && [ -z "$DO_SWAPON" ] && [ 26-z "$DO_FDISK" ].. 18 s) DO_SWAPON=1 . " >> 30$ARQUIVO_LOG 31 if [ "$DO_UNAME" == 1 ].. A cada iteração do laço." 43 if [ "$DO_UNAME" == 1 ].u) DO_UNAME=1 15 . 16 m) DO_FREE=1 17 .. O laço while getopts começa a tratar todos os argumentos. 19 ?) PrintUsage 20 . then uname -a 44 fi 45 46 if [ "$DO_FREE" == 1 ]. then 39 swapon -s >> $ARQUIVO_LOG 40 fi 41else 42 echo "Execucao iniciada em `date`.

o $1 seria o argumento1 e o $2 seria o argumento2. Este valor é automaticamente armazenado na variável $OPTARG.sh: illegal option -. Represente bem suas opções com as letras! :) Argumentos dentro de funções . sem o shift. Exemplo: . eles seriam respectivamente o $5 e $6.log -m argumento1 argumento2 Nesse caso./tmp. colocamos uma letra no primeiro argumento do getopts: while getopts "hvo:umsf" OPTION Note também que depois da letra o temos um dois pontos (:). não importa a ordem. até que não sobre nenhuma opção. os argumentos representados pelas variáveis $N só serão aqueles que não pertençam a nenhuma opção. voce só pode utilizar uma letra como opção.log) .sh -o arquivo. o usuário precisa fornecer um valor./tmp./tmp. por exemplo: $ . E se você colocar uma opção que não está contemplatada« O ³?´ do case irá ser executado. quando na verdade./tmp. ele executa o comando que está na linha 28: shift $((OPTIND -1)) Este comando faz com que os argumentos de opções sejam ³comidos³. a função getopts do bash não aceita opções longas (±nomeda-opcao). Dessa maneira. o getopts vai reconhecer e executar as ações de acordo com a opção especificada. podemos executar esse programa de diversas formas: . Em outras palavras.a Uso: tmp. Esse dois pontos significa que logo após a opção -o.Note que para cada opção que precisamos.sh -m -s -u (executa os comandos "free -m".sh < -umsf> [-ohv] E dessa forma fica bem fácil de entender e usar o getopts :) Depois que o laço é todo feito e executado em todos os argumentos (no meu caso.log -u (executa o "uname -a" e grava no arquivo arquivo. ou seja. Como nem tudo é perfeito. preferi apenas configurar variáveis para cada opção e tratá-las depois)./tmp.sh -um (executa os comandos "uname -a" e "free -m") .sh -a . "swapon -s" e "uname -a") Ou seja./tmp.sh -u -o arquivo.

as variáveis especiais dos argumentos funcionam apenas para a função e não para o programa inteiro. dentro de uma função as variáveis $N definidas pelo programa não funcionarão. além de mostrar uma mensagem de uso. Um bom exemplo disso é implementar a função PrintUsage que usamos anteriormente para.Se dentro de um shell-script temos uma função.sh Numero de argumentos: 4 Argumento 1: a Argumento 2: b Argumento 3: c Argumento 4: d Sabendo disso.sh Numero de argumentos: 0 $ ./tmp. do COUNT=`expr $COUNT + 1` 08 echo "Argumento $COUNT: $ARG" 09 done 10} 11 12Dummy 13 Não importa o que você executar com o script acima./tmp. É como se as variáveis fossem locais. como mostrado a seguir. a saída será sempre a mesma: 0 números de argumentos./tmp. essa função é enxergada pela shell como se fosse um comando. Exemplo: ? 01 02#!/bin/bash 03 function Dummy() { 04 echo "Numero de argumentos: $#" 05 06 COUNT=0 07 for ARG in $*. e não globais. não se percam na hora de usar os argumentos dentro das funções e lembrem-se que isto pode ser útil na hora de implementar diversas funções dentro de um script. mostrar também uma mensagem de erro personalizada: ? .sh a b c d e f g Numero de argumentos: 0 Para a função Dummy.sh naosei temporario Numero de argumentos: 0 $ . Nesse sentido. $ ./tmp. Vamos então substituir a linha da chamada da função Dummy (linha 13) por: Dummy a b c d E tentar executar novamente: $ .

1function PrintUsage() { 2 [ "$1" ] && echo -ne "Erro: $1 \n" 3 echo "Uso: $(basename $0) <-umsf> [-ohv]" 4 exit 1 5} Agora é so chamar a função como« PrintUsage "Faltando parâmetros." Use a criatividade de um programador (afinal. programação é arte) e comece a aprimorar suas ferramentas bash! :) ." PrintUsage "Opção inválida." PrintUsage "No donut for you.

Para fazer o agendamento. Aqui colocarei o script para ser executado de 2 em 2 minutos. podemos colocar o dhclient para ser usado. Com pequenas alterações. É uma solução simples e não é totalmente segura. ele vai executar mesmo assim. ao invés da própria máquina. usamos o crontab executando como root ³crontab -e´ ou (2a. then $UDHCPC -i eth0 -q else exit 0 fi O TEST_IP é um IP da Internet para que o ping seja feito. reconecta-se de alguma forma. além do script é necessário também o agendador de tarefas crontab. . usei um dos IPs do Google. Também. um log) que acontecerão quando a conexão falhar. Neste exemplo. O script. Por exemplo.47. ao invés do udhcpc. checkConn. Escolha um intervalo para ficar executando este script.sh «fará isso. A linha: */2 * * * * /usr/local/bin/checkConn.147" # UDHCPC UDHCPC=/sbin/udhcpc if ! `ping -c1 $TEST_IP > /dev/null 2>&1`. Para funcionar. e caso não esteja. se o IP que tentamos pingar está fora. Em resumo. este script pinga um IP e caso não haja resposta. neste caso utilizei o cliente DHCP UDHCPC.Shell-Script: Reconexão Automática Este shell-script verifica se uma máquina está conectada na rede. opção) editando o arquivo ³/etc/crontab´. executa o udhcp pedindo um novo IP. Ou também podemos colocar depois do ³if´ quaisquer comandos (como por exemplo.sh: #!/bin/bash # # IP de Teste TEST_IP="74.125.

Ao executar o comando passando o famoso "&" no final da linha o terminal ficava livre. que será criado no diretório corrente (onde o comando foi executado).O comando nohup Essa é uma dica simples e rápida. Enfim. mas que me quebrou um galho (ou seria árvore?) um dia desses. pra rodar um comando em background e fazer com que o mesmo fique imune a sinais de hangup.com.br/shell_script/ ./comando_que_vai_demorar & A saída do comando será gravada no arquivo nohup. Simples assim! Fonte: http://www. Exemplo de uso: # nohup . usa -se o comando nohup. Eu precisava deixar um comando rodando num servidor remoto.devin. Agora você pode desconectar do terminal remoto e ir pra casa tranquilo.out. mas ao deslogar do terminal o comando recebia um sinal de hangup e "morria". porém não continuaria conectado via ssh neste.