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.

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

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

" echo "Opções:" echo echo "1. Vejamos a sintaxe de uma função: funcao() { comando1 comando2 . Trasformar nomes de arquivos" echo "2. já predefinidas. como no exemplo final. não? A função funcionará como um simples comando próprio. na página de manual do bash (comando ³man bash´. e os comandos 1. Adicionar um usuário no sistema" echo "3. Deletar um usuário no sistema" echo "4. Fazer backup do s arquivos do /etc" echo "5. A flexibilidade das funções permite facilitar a vida do programador. Você executa a função em qualquer lugar do script shell. Sair do exemplo" . 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.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 "-----------------------------------------. Funções Funções são blocos de comandos que podem ser definidos para uso posterior em qualquer parte do código. Praticamente todas as linguagens usam funções que ajudam a organizar o código. e o script3 com a shell tcsh. } Fácil de entender.. seção Shell Variables). Exemplo Final Agora vamos dar um exemplo de um programa que utilize o que aprendemos com os artigos.. 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.

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

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

Isto ocorreu pelo fato de eu ter colocado o direcionador 2> para o arquivo resposta. Se eu colocasse o redirecionador 2>. Desta vez usaremos a opção ±menubox para gerar um menu com os itens a serem selecionados. se você praticar bastante pode criar \ \nprogra mas incríveis e facilmente. Apropósito. Você precisará praticar bastante e conhecer as várias opções. Se eu colocasse a opção ±stdout na linha de comando do Xdialog. Vamos ver agora seleção de itens. Mais uma vez. que daria muito mais \ \ntrabalho fazendo em outras linguagens. é só mudar estes dois números.. Eu vou dar vários exemplos aqui e sair comentando cada opção. se quiser mudar o tamanho da janela. Vamos esclarecer uma coisa aqui também« Depois do texto ³Qual sua distribuição Linux favorita?´. e gosta. Isto é chamado de checklist. poderia ir para um arquivo como no exemplo anterior. e pode ser visto no exemplo a seguir: . qual o seu preferido? \n \ Sua resposta será gravada no arquivo resposta. Tente você. then echo "Você saiu do programa.." fi Viu como funciona? Agora vamos ver outros recursos que o Xdialog pode oferecer. que é uma das coisas mais importantes num programa. 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. vamos criar uma janela em que o usuário poderá escolher uma ou mais opções. Nos exemplos anteriores eu coloquei ³0 0 pois aí o Xdialog dimensiona automaticamente o tamanho da janela. a resposta que este usuário digitou será gravada no arquvio resposta. 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. No primeiro exemplo eu usei a opção ±yesno que gerava o sim e não. Agora usei o ±msgbox. Agora como último exemplo. a resposta do usuário apareceria na tela." \ 0 0 2> resposta Depois que o usuário preenche o campo e dá Ok. Então já sabe. Estes dois números correspondem à altura e comprimento da janela.elif [ $? = "1" ]. 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)." \ 0 0 O usuário aperta Ok e o shell-script continua normalmente. há 2 números.

Se você pensa que isto é tudo. sintase a vontade para me mandar um e-mail. e o off que não deverá estar marcada. Espero que estas informações foram úteis a você e até a próxima :) . só que pode-se selecionar vários itens ±radiolist Mesmo que ±menubox. Para não ter que ficar comentando cada opção.Xdialog --title "Último exemplo . ainda tem muito mais por trás do Xdialog. onde se seleciona um item menubox ±checklist Mesmo que ±menubox. as mesmas serão o resultado.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. Se o usuário escolher 3 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. Verifique que depois de cada opção há o on e o off. Outra coisa. Se você fizer algum programa legal em shell-script. 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. O on indica que esta opção deverá já estar marcada. 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. 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. vou dar uma lista de parâmetros e a descrição de suas funções. você pode usar a mesma sintaxe para criar estas ³janelas´ no modo console. Bem fácil criar uma interface amigável para suas shell-scripts.

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

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

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

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

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

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

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

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

Alguns destes ³atalhos´: .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. estávamos no diretório /usr/games e com um simples cd para o diretório ~. pwd ± Exibe o diretório atual Sintaxe: $ pwd Mostra de forma simples em qual diretório o usuário está localizado no momento. Neste caso utilizamos o ~ que é uma espécie de atalho para o diretório HOME do usuário. usa-se a / antes.d $ pwd /etc/rc. cd ± Navegando entre diretórios Sintaxe: $ cd [nome_do_diretório] Muda o diretório atual.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. exemplo: $ pwd /usr/local/bin $ cd /etc/rc. (ponto) ~ (til) / (barra) . Em sistemas operacionais como o Linux. Exemplos: $ pwd /usr/games $ cd ~ $ pwd /home/eitch No exemplo acima. fomos para o diretório HOME (/home/eitch)..(hífen) Diretório atual Diretório HOME do usuário Raiz do sistema Último diretório (Voltar) . mexer com arquivos é essencialmente tudo o que você vai fazer ao configurar o sistema e seus serviços.

grupo dono. ou seja. Se não colocamos a barra para especificar a raíz. o que significa que ele é um diretório. data de modificação e por último o nome do arquivo. Em outras palavras.txt . Exemplo. se eu estou no diretório /home/eitch. ao contrário dos outros arquivos que não contém nenhuma letra (-) e por isso são arquivos comuns. p para um FIFO. os arquivos e diretórios são listados com outras informações antes de seus nomes. listar todos os arquivos que têm a extensão . É possível identificar o tipo de arquivo desta maneira e as letras podem ser: b para arquivo especial de bloco. só que um usando o caminho relativo e o outro o caminho absoluto: $ cd .pdf MySQL. usuário dono. c para arquivo especial de caracter. $ cd /home ls ± Listar arquivos Sintaxe: $ ls [opções] [arquivo/diretório] Lista os arquivos e diretórios. s para socket. -a Lista os arquivos ocultos (que começam com um . ou seja. Podemos também usar no ls o que chamamos de wildcards (caracteres coringa). quer dizer que estamos especificando um caminho relativo. tamanho.. especificamos o caminho absoluto do diretório.) -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. ele mostrará todos os arquivos existentes no diretório atual. número de hard links. Se executarmos apenas o comando ls sozinho. d para diretório.Ao utilizar uma barra antes do diretório. todo o seu caminho desde a raiz. os dois comandos a seguir farão a mesma coisa. de acordo com o diretório atual.txt: $ ls *. Podemos ver acima que a segunda linha (diretorio) inicia com a letra d. 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. ou seja.pdf PHP. Há também alguns parâmetros extras: -l Lista os arquivos em formato detalhado. l para link simbólico. caracteres que substituem outros.pdf No exemplo acima.

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

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

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

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

o comando /pesquisa para pesquisar por uma palavra no documento e a tecla q para sair. a tecla ESPAÇO vai passando as páginas. 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. Por padrão. continua mostrando as linhas na medida que o arquivo é atualizado. criam uma espécie de paginação. No comando more. 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. a paginação funciona como em uma página de manual (na verdade. visualizar o final para ver os últimos acontecimentos é uma prática comum. utilizar as teclas PgUp e PgDown para paginar.head. as vezes é necessário apenas visualizar parte dele. O comando head. 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. mostra o começo de um arquivo. Em arquivos de log por exemplo. 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. 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. Útil para visualizar logs em constante atualização. podemos especificar a quantidade de linhas. até quando o fim do arquivo chega e o o comando finaliza. No less. O comando tail (calda) mostra o final de um arquivo. como o nome diz (cabeçalho). less ± Visualiza arquivos por páginas Sintaxe: $ more <ar quivo> Sintaxe: $ less <arquivo> Parecidos com o cat. ambos comandos mostram as 10 linhas correspondentes. Exemplo: # tail -f /var/log/httpd/access_log more. file ± Indica o tipo de arquivo . ao invés de 10. Por exemplo.

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

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

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

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

todos podem fazer tudo no arquivo. escrever e executar o arquivo. Outro exemplo: . escrever e executar o arquivo. além de seu nome e conteúdo. escrever e executar o arquivo. mas não pode escrever. Devido às permissões deste diretório. quando há um ³-´ no lugar da letra. Todos os outros podem ler. arquivos e diretórios têm de pertencer à um certo usuário e grupo. significa que não há essa permissão. O grupo dono (coletivo) pode ler e executar. Em outras palavras.Permissões Permissões de Acesso Todo arquivo ou diretório tem. apenas o usuário dono (root) pode entrar e mexer nele. Vejamos agora o exemplo do diretório apostila: drwxr-xr-x 2 coletivo coletivo 4096 2008 -08-29 13:35 apostila Neste caso. Todos os outros podem ler e executar. 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. os próximos 9 caracteres são uma sequência de permissões. 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). Então podemos ler a linha da seguinte forma: O usuário dono (coletivo) pode ler. propriedades que restringem o seu uso. Como o Linux é um sistema operacional multi-usuário. o exemplo rwxrwxrwx significa literalmente: O usuário dono pode ler. Este tipo de funcionalidade é essencial em um sistema multi-usuário real. O diretório /root por exemplo pertence ao usuário root e grupo root. O oposto disto seria a combinação ³²²²´. mas não podem escrever. escrever e executar. O comando ls -l mostra uma listagem detalhada dos arquivos do diretório atual e isso inclui suas permissões. O grupo dono pode ler.

O grupo dono (cdrom) pode ler e escrever.1 root audio 14. Todos os outros não podem ler. 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. mas não pode executar. Modificando os donos Ao utilizar o ls -l. 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---. quanto para o arquivo /dev/hda: O usuário dono (root) pode ler e escrever. seria: # chown root. mas não pode executá-lo. Os outros não podem ler. podemos ver o usuário dono e o grupo dono dos arquivos e diretórios. lembrando que apenas o usuário root pode fazer isto. especificado no comando através do grupo precedido por um ponto.$ ls -l /dev/dsp crw-rw---. não podem escrever e nem executá-lo. o usuário dono e o grupo dono serão os do usuário coletivo.root coletivo O comando chown também modifica o grupo dono. O grupo dono (audio) pode ler e escrever no arquivo. tanto para o arquivo /dev/cdrom. O usuário dono (root) pode ler e escrever neste arquivo. Modificando as permissões . Se criarmos um arquivo com o usuário coletivo. em um comando só. mas não pode executar. 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. 0 2008 -08-29 07:57 /dev/hda Ou seja. 3 2008 -08-29 07:57 /dev/dsp O arquivo /dev/dsp é do tipo ³arquivo especial de caracter´ (c). 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).1 root cdrom 3. não podem escrever e nem executá-los. mas não pode executá-lo.

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

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

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

estes usuários só poderão apagar seus próprios arquivos. $ 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). 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. Forma Octal dos Bits Especiais Vimos as formas extendidas de se configurar os bits especiais. criar. Mas também há a forma octal. . apagar arquivos e entrar no diretório.O Sticky é representado pela letra t no terceiro campo de permissões: outros. $ 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). O umask é um comando e funciona especificando uma máscara de permissões tanto em uma forma extendida quanto na forma octal. que funciona da mesma maneira que os bits de leitura. 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). Porém. o SUID foi adicionado neste arquivo através do número 4. 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. Esta característica é conhecida pela definição ³umask´. como existe o Sticky bit. não precisamos configurar suas permissões. Máscara padrão de permissões Toda vez que criamos um arquivo. no lugar do x. parecido com o comportamento do comando chmod. a máscara de permissões.

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

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

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

v) echo "`basename $0` versao 666.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." 11 exit 12 . mostra o resultado do comando ³uname -a´ Caso a opção -m seja usada. Supondo que queiramos um shell-script que faça isso: y y y y y y Caso a opção -h seja usada. mostra o resultado do comando ³swap -s´ Note que apenas as opções -h e -v saem do programa após a execução../tmp. E se uma das opções precisasse de um valor? Estilo ³-f arquivo. mostra a versão e sai do programa. mostra o resultado do comando ³free -m´ Caso a opção -s seja usada. Caso a opção -u seja usada..$ . mostra a ajuda e sai do programa. 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 . .. 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. Poderíamos escrever vários algoritmos que verificassem cada um de todos os argumentos. testasse se fosse um ou outro. 13 o) ARQUIVO_LOG=$OPTARG 14 ./tmp. Caso a opção -v seja usada. Caso a opção -o <arquivo> seja usada.log´ gravaria um arquivo de log com as operações. vamos logo para um exemplo de programa. Utilizando o getopts para tratar tratar argumentos e opções Seguindo a mesma linha de raciocínio.sh -O Opcao invalida! $ . grava um arquivo de log com as operações efetuadas e resultados.

... then PrintUsage 27fi 28 29if [ "$ARQUIVO_LOG" ]. ele coloca a letra da opção na variável $OPTION.u) DO_UNAME=1 15 . 19 ?) PrintUsage 20 . . then 47 free -m 48 fi 49 if [ "$DO_SWAPON" == 1 ]. A cada iteração do laço." 43 if [ "$DO_UNAME" == 1 ]. " >> 30$ARQUIVO_LOG 31 if [ "$DO_UNAME" == 1 ].. O laço while getopts começa a tratar todos os argumentos. 18 s) DO_SWAPON=1 . then 36 free -m >> $ARQUIVO_LOG 37 fi 38 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" ]. then 32 uname -a >> $ARQUIVO_LOG 33 fi 34 35 if [ "$DO_FREE" == 1 ]. then echo "Execucao iniciada em `date`. then 39 swapon -s >> $ARQUIVO_LOG 40 fi 41else 42 echo "Execucao iniciada em `date`. then uname -a 44 fi 45 46 if [ "$DO_FREE" == 1 ]. 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. 16 m) DO_FREE=1 17 .

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

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 mostrado a seguir. mostrar também uma mensagem de erro personalizada: ? .sh naosei temporario Numero de argumentos: 0 $ ./tmp.sh Numero de argumentos: 0 $ . essa função é enxergada pela shell como se fosse um comando.sh Numero de argumentos: 4 Argumento 1: a Argumento 2: b Argumento 3: c Argumento 4: d Sabendo disso. $ . Exemplo: ? 01 02#!/bin/bash 03 function Dummy() { 04 echo "Numero de argumentos: $#" 05 06 COUNT=0 07 for ARG in $*. dentro de uma função as variáveis $N definidas pelo programa não funcionarão./tmp. Um bom exemplo disso é implementar a função PrintUsage que usamos anteriormente para. além de mostrar uma mensagem de uso./tmp. Nesse sentido. a saída será sempre a mesma: 0 números de argumentos. 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.Se dentro de um shell-script temos uma função. e não globais. as variáveis especiais dos argumentos funcionam apenas para a função e não para o programa inteiro.sh a b c d e f g Numero de argumentos: 0 Para a função Dummy. É como se as variáveis fossem locais. Vamos então substituir a linha da chamada da função Dummy (linha 13) por: Dummy a b c d E tentar executar novamente: $ .

" PrintUsage "Opção inválida." PrintUsage "No donut for you." Use a criatividade de um programador (afinal.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. programação é arte) e comece a aprimorar suas ferramentas bash! :) .

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

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

Sign up to vote on this title
UsefulNot useful