Processos, parte 3: Capturando saídas com Backtick, ` (crase)

parte 1: Introdução
parte 2: Iniciando (launching) e matando (killing) processos
parte 3: Capturando saídas com Backtick, ` (crase)
parte 4: calculadora/comando bc
parte 5: Códigos de retorno (return codes)

Usar a saída de processos, seja para usar o código de retorno do processo, seja para definir ou colocar arquivos inteiros em variáveis, usar a saída deles é de imensa utilidade em Shell Scripting. É usar, de verdade, o sistema.

- Usando a crase (backtick)

Se colocarmos um comando entre crases,``, é a saída do comando que aparecerá. Ou seja, estamos substituindo o comando pela sua saída, parecido com o que o Shell faz ao substituir o valor da $variavel.
Por exemplo, vamos usar a saída do 'ls':

---------
for arquivo in `ls`
do
echo "Arquivo: $arquivo"
done
---------


O uso das backtick vem de longo tempo. Há porém, maneiras mais modernas de fazer isso, como o uso de parêntesis.
$(comando flags argumentos)

Se há diferenças entre `` e $(), desconheço.


* Passando a saída dos comandos para variáveis
Se dá através da crase:
data=`date`
echo $data

Sabemos que $0 armazena o endereço completo do script na forma: /caminho/do/arquivo.log
Porém, usamos geralmente só o 'arquivo.log'. Para pegar so o nome do script, usamos o comado 'basename':
nome_do_script=`basename $0`

Caso queira descartar a extensao:
nome_do_script=`basename $0 .log`


- Usando a crase para fazer cálculos

É possível fazer cálculos com o comando 'expr'. Por exemplo:
expr 2 + 2

Mas, há alguns detalhes. Teste:
expr 2 * 2
expr "2 * 2"

Você deve ter obtido um erro de sintaxe, já que esta expressão não é permitida, pois antes de ser o caractere que representa o produto, é um wildcard, ou seja, é interpretado antes pelo Shell do que pelo 'expr'. O correto seria:
expr 2 \* 2

Outro exemplo, agora usando a crase para armazenar dados:
x=1;
expr $x + 1
x=`expr $x + 1`
echo $x

x=`expr $x + 1`
echo $x

Para backticks aninhados, devemos escapar as backticks de dentro:
a=`b=\`expr 2 \* 2 \`; expr $b + 1 `

Aqui, fazemos b=2*2 e depois a=b+1


- Fazendo variáveis receberem arquivos

É sabido que praticamente tudo em Unix são arquivos, e que estes são, no geral, textos.
Podemos então, fazer com que variáveis em nossos scripts armazenem o conteúdo de um arquivo de uma maneira bem simples:
variavel=`cat /caminho/pro/arquivo`


Ou
variavel=`</caminho/pro/arquivo`

Não é aconselhável carregar uma variável com arquivos de conteúdo muito grande ou que sejam binários.

Nenhum comentário: