Jedi Tux

4 de janeiro de 2012

Bash – comandos, argumentos e a importância das apas

Arquivado em: 5584,Linux — Fernando Basso @ 10:52
Tags: , , , , , ,

Intro

Interactive mode: modo de operação onde um prompt de comando espera que você digite um comando por vez.

Script: um arquivo que contém uma sequência de comandos para serem executados um após o outro.

Ao iniciar o Bash, bash –posix ou set -o posix se o Bash já está em execução coloca o Bash em modo POSIX.

No Arch Linux (e quase todas as outras distribuições), /bin/sh é um symlink para /bin/bash. Se o Bash é invocado com o nome “sh”, ele tenta imitar o comportamento de versões históricas do sh o melhor possível, enquanto conformando com o padrão POSIX. Neste modo, o Bash lê os arquivos de inicialização e então entra em modo de compatibilidade com o padrão POSIX.

/etc/profile é lido por todos todo Bourne-compatible shell no login. Ele configura o ambiente e carrega configurações específicas a certas applicações (/etc/profile.d/*.sh).

.profile é lido pelo Bash quando um shell com login interativo é iniciado.

.bashrc é lido pelo Bash quando um interativo non-login shell é iniciado, por exemplo, quando alguém abre um console virtual (x terminal) a partir de um Window Manager ou Desktop Environmen (Openbox, LXDE, Gnome, KDE, etc.). Este arquivo é útil para configurar o ambiente de shell específico do usuário.

Leia mais: https://wiki.archlinux.org/index.php/Bash

Comandos e Argumentos

 O Bash lê linhas do terminal (usuário digitando comandos) ou de arquivos. Cada linha é uma comando – uma tarefa para ser executada.

 IMPRTANTE: O Bash divide cada linha em palavras. Palavras são separadas por espaços.

 A primeira palavra em uma linha/comando é o nome do comando. Todas as outras (palavras) são os argumentos que são passados para o comando especificado.

 echo This is a test echo → é o nome do comando;

this → é um argumento.

is → outro argumento.

a → mais outro argumento.

test → ainda mais um argumento – e o último, no exemplo.

 MAS:

echo"This is a test"

echo → é o nome do comando.

“This is a test” → é um único argumento.

 As aspas não são parte do argumento. O Bash as remove antes de lidar com o argumento.

 CUIDADO: Digamos que temos dois arquivos em um diretório. Os arquivos são:

“The secret voice in your head.ogg”

“secret”

 “secret” contém um segredo muito importante que pode salvar o mundo.

E agora você faz:

 rm The secret voice in your head.ogg

 O Bash vai pensar que você passou seis argumentos, e um deles é “secret” – seu venerado arquivo. Você recebeu erros porque o comando rm não conseguiu remover/encontrar os arquivos “The”, “voice”, “in”, “your”, e “head.ogg” (já que eles não são arquivos por si próprios), exceto “secret”, é que sim um arquivo. É por isso quo Bash reclamou dos outros mas não reclamou de “secret”. Agora o pior: o arquivo chamado “secret” já era. Para sempre se foi (não tem lixeira na linha de comando), e a música (que é o que queríamos deletar) ainda está lá. A maneira correta é usar apas:

 rm “The secret voice in you head.ogg”

Assim, você está agrupando todas as palavras em um único argumento. Descanse em paz. O “segredo” está seguro agora.

 Veja este próximo caso.

 [ é um comando, similar ao comando test. Se testarmos alguma coisa assim:

 [-f file.txt]

 …está errado. -f não deve estar “colado” ao [. Devemos separá-los. [ é o nome do comando, portanto uma palavra. -f é a segunda palavra (um argumento), file é a terceira palavra (outro artumento) e o ] é o ultimo argumento – que é mandatório toda vez que usamos [. Esta é a maneira correta (note os espaços):

 [ -f file.txt ]

 A propósito, uma maneira mais aconselhável ainda é colocar o nome do arquivo entre aspas (você já viu o que pode acontecer se um nome de arquivo contém espaços, e não o protejemos com aspas).

 [ -f "my file" ]

É boa prática sempre usar apas.

 Uma dica rápida: use o perl-rename para mudar todos os espaços nos nomes dos arquivos por underscores:

 perl-rename ‘s/ /_/’ ./*.txt

 …para arquivos .txt (mude a extensão para outros tipos de arquivos), ou

 perl-rename ‘s/ /_/’ ./*

 …para todos os arquivos do diretório.

 NOTA: No Arch Linux, no nome é perl-rename. prename em outras distros – não confunda com rename, que é um comando bem simplificado e não faz o que o exemplo mostra. (Se não me engano já vi uma distro em que rename era na verdade o um symlink para o perl-rename).

Este conteúdo é basicamente um tradução livre do (excelente) site:

http://mywiki.wooledge.org/BashGuide

Este conteúdo não é, de forma alguma, mérito meu, mas sim dos proprietários do site acima mencionado.

25 de dezembro de 2011

Expressões Regulares no BASH – Parte 2

Arquivado em: Bash — Fernando Basso @ 17:35
Tags: , , ,

BASH – Expressões Regulares – Parte 2

Sunday, 10:47 – December 25 – 2011

  1. Extrair Nome do Script ou o Path para o Script
  2. Verificando por Sub-Strings
  3. Substituições Básicas
  4. Remover do início da string
  5. Remover do fim da string

Dando continuação aos exemplos do primeiro tutorial sobre expressões no
bash, vamos a mais alguns exemplos diversos, que basicamente usam o que já
aprendemos anteriormente.

Extrair Nome do Script ou o Path para o Script

Sabemos que no linux os caminhos de diretórios são compostos pelos nomes
dos diretórios separados pela barra (/). Em muitos dos nossos próximos
exemplos, a barra não será usada como delimitador, mas como o próprio
elemento que queremos encontrar. Tenha isso em mente enquanto estuda os
próximos exemplos.

A variável “$0″ é interna do bash, e ela mostra o nome do script.
Se executamos o script do diretório onde ele está, tudo bem, o output
mostrará o nome do script normalmente.

echo "$0"

É lógico que a variável $0 só fará sentido se utilizada
dentro de um script. Para testar pela linha de comando podemos simular
criando uma variável que contém um path (caminho) qualquer e usar a essa
variável em vez de $0:

var="/usr/local/bin/my_script"

Continuando o assunto, se o script está em /usr/local/bin/
por exemplo, então $0 vai mostrar o caminho completo do arquivo, e não
apenas o nome dele. A solução é deletar a parte que não queremos.

echo "${0##*/}"

NOTE que agora o / não é mais o delimitador. Ele é o próprio
caractere que queremos encontrar. Suponha que o script se chama
my_script, então o caminho completo será
/usr/local/bin/my_script. Em português ficaria “mostre o
conteúdo da variável $0, e delete tudo (*) até a ultima barra possível (/).
Restará só o nome final: my_script

.

Por outro lado, se queremos mostrar somente o caminho, sem o nome do
arquivo propriamente dito, temos que deletar de trás pra frente, usando o
'%' ou o '%%'.

echo "${0%%/*}"

Em português, “do final da string (%%), delete tudo (*) até encontrar a
barra (/). Sei que é estranho, por que mesmo sendo de trás pra frente, o
‘%%’ continua logo após a variável, como é o caso do ‘#’ ou ‘##’. O jeito é
acostumar, pois é assim mesmo.

Os créditos do próximo exemplo vão para mywiki.woolege.org. A
única coisa que fiz foi tentar explicar de uma maneira um pouco
diferente.

Digamos que não queremos apenas o nome final, mas as duas ultimas partes.
Bom, vamos pensar um pouco por vez. Primeiro, pegamos as partes que não
queremos, e salvamos em uma variável. Antes vamos testar. Vamos ver se a
expressão está realmente mostrando somente a parte que não queremos:

echo "${var%/*/*}"

Deleta do final até a primeira barra (/*) e deleta mais uma vez até a
próxima barra (/*). Por isso usamos /*/*. Agora sim, assine
essa regexp na variável tmp. Veja que executando o
echo, acima na verdade a espressão está deletando as duas ultimas
partes. Não tem problema, desde que salvemos essa expressão na variável.

tmp="${var%/*/*}"

Para se certificar de que a expressão está correta, vamos ver o que foi
salvo na var tmp:

echo "$tmp"

tmp agora possui '/usr/local'. Vamos então
deletar do início da string, todo o conteúdo que está em
tmp:

echo "${var#$tmp}"

É o mesmo que:

echo "${var#/usr/local/}"

Ou seja, deleta '/usr/local' deixando somente o final que
queriamos '/bin/my_script'. Faça você mesmo várias vezes e
invente exemplos próprios parecidos com esse até acostumar.

Mais um exemplo:

var="nada importante <jackpot> ... não interessa"

Agora, por algum motivo, queremos ficar somente com jackpot:

tmp="${var##*<}" # Remove do início até o <.
echo "${tmp%>*}" # Remove do > até o fim da string.

Pronto, só nos restou o que estava entre < e >.

Mais um exemplo:

      var="Isto é 'melhor' que aquilo."
      tmp="${var#*\'}" # Temos que escapar a aspa simples (\').
      echo "${tmp%\'*}" # Sobra apenas "melhor" (sem as apas).
    

Voltar


Trabalhando Com Posições Fixas – Ranges

Se sabemos quantos caracteres à direita ou a esquerda queremos, fica muito fácil:

var="ABCDEFGHIJ"

Mostramos somente os dois primeiros caracteres, ou seja, do zero ao dois:

echo "${var:0:2}"

Mostrar as últimas três posições, ou seja, da posição 7 a posição 10:

echo "${var:7:10}"

O mesmo pode ser conseguido com:

echo "${var:(-3)}"

Tenha cuidado com a sintaxe.

Em construção…

Tema: Rubric. Blog no WordPress.com.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.