Dicas Linux Shell Script

07-05-2020

---

Dicas Linux Shell Script?

---

Algumas dicas e truques sobre como trabalhar com o shell script do Linux?

---

Dica:

Pesquise e pratique na mesma hora. Web browser, editor de texto e terminal abertos lado a lado e não fique pulando de uma distro para outra.

---

Dica:

O caminho absoluto, contém o caminho completo a partir da raiz (/).

---

Dica:

Use = em vez de == para comparações de strings

Ex.

valor1=”coisaA”
valor2=”coisaB”

if [ "$valor1" = "$valor2" ]

---

Dica:

Use $(comando) em vez de `comando`.

Usar: user=$(echo “$UID”)

Não usar: user=`echo “$UID”`

---

Dica:

Use read-only para declarar variáveis estáticas:

readonly passwd_file=”/etc/passwd”
readonly group_file=”/etc/group”

---

Dica:

Use funções em bash shell scripts.

Exceto por scripts muito pequenos (com algumas linhas de código), lembre-se sempre de usar funções para modularizar seu código e tornar os scripts mais legíveis e reutilizáveis.

function nome_função(){
comando1;
comando2;
}

---

Dica:

Para código de linha única, use caracteres de terminação após cada comando como este:

nome-da-função(){ comando1; comando2; }

---

Dica:

Chamar a função na mesma linha de código:

nome-da-função(){ comando1; comando2; }; nome-da-função

---

Dica:

-exec COM VÁRIOS COMANDOS.

Não podemos usar vários comandos junto com o parâmetro –exec. Aceita apenas um único comando, mas podemos usar um truque (hack).

Escreva vários comandos em um script de shell (por exemplo, commands.sh) e use-o com –exec da seguinte forma:

-exec ./commands.sh {} ;

---

Dica:

PESQUISE RECURSIVAMENTE MUITOS ARQUIVOS.

Dica: Para pesquisar recursivamente por um texto sobre vários diretórios de descendentes, use:

grep "texto" . -R -n

usando o comando dentro de uma função:

pesquise(){ grep "texto" . -R -n; }; pesquise

Este é um dos comandos mais utilizados pelos desenvolvedores. Ele é usado para localizar o arquivo do código-fonte no qual um determinado texto existe.

---

Dica:

Use maiúscula para variáveis de ambiente e minúsculas para variáveis personalizadas.

---

Dica:

COMANDO BEM SUCEDIDO E MALSUCEDIDO.

Dica: Quando um comando retorna após o erro, ele retorna um status de saída diferente de zero. O comando retorna zero quando termina após a conclusão bem-sucedida. O status de retorno pode ser lido da variável especial $? (execute echo $? imediatamente após a instrução de execução do comando para imprimir o status de saída).

echo $?

---

Dica:

USE UM CAMINHO ABSOLUTO PARA O EXECUTÁVEL.

---

Dica:

Um binário executável do comando time está disponível em /usr/bin/time, assim como existe um tempo nomeado no shell embutido.

Quando corremos o tempo, ele chama o shell embutido por padrão.

O tempo interno do shell tem opções limitadas. Portanto, devemos usar um caminho absoluto para o executável (/usr/bin/time) para executar funcionalidades adicionais.

---

Dica:

FORK BOMB - CUIDADO PERIGO!

:(){:|:&};:

Esta função recursiva é uma função que chama a si mesma. Ele gera processos infinitamente e acaba em um ataque de negação de serviço.

& é pós-fixado com a chamada de função para colocar o subprocesso em segundo plano. Este é um código perigoso, pois ele cria processos e, portanto, é chamado de fork bomb.

Você pode achar difícil interpretar o código acima.

---

Dica:

Veja a página da Wikipedia:

http://en.wikipedia.org/wiki/Fork_bomb para mais detalhes e interpretação da bomba.

Ele pode ser evitado restringindo o número máximo de processos que podem ser gerados a partir do arquivo de configuração /etc/security/limits.conf.

---

Dica:

ESPECIFIQUE -maxdepth e –mindepth como o terceiro argumento.

-maxdepth e -mindepth devem ser especificados como o terceiro argumento para o find.

Se eles forem especificados como quarto ou mais argumentos, isso poderá afetar a eficiência do find, já que ele precisa fazer verificações desnecessárias (por exemplo, se –maxdepth for especificado como o quarto argumento e –type como o terceiro argumento, o comando find primeiro descobre todos os arquivos que possuem o tipo especificado e, em seguida, localiza todos os arquivos correspondentes com a profundidade especificada.

No entanto, se a profundidade for especificada como o terceiro argumento e

–type

como a quarta, o find poderá coletar todos os arquivos mais a profundidade especificada e, em seguida, verifique o tipo de arquivo, que é a maneira mais eficiente de pesquisa.

---

Dica:

-n OPÇÃO PARA ORDENAÇÃO NUMÉRICA.

Sugestão:

Tenha sempre cuidado com a opção -n para ordenação numérica.

O comando sort trata a classificação alfabética e o ordenamento numérico de forma diferente. Portanto, para especificar a classificação numérica, a opção –n deve ser fornecida.

---

Dica:

O ## OPERADOR.

Dica:

O operador ## tem mais preferência sobre o operador # para extrair uma extensão de um nome de arquivo, pois o nome do arquivo pode conter vários caracteres "." Como ## faz uma combinação gananciosa, ele sempre extrai apenas extensões.

---

Dica:

COLOCAR ATRIBUIÇÕES DE VARIÁVEIS.

Geralmente, colocamos atribuições de variáveis iniciais, como var=0; e instruções para imprimir o cabeçalho do arquivo no bloco BEGIN. No bloco END {}, colocamos instruções como resultados de impressão e assim por diante.

---

Dica:

EXCLUINDO UM CONJUNTO DE ARQUIVOS DO ARQUIVAMENTO

Dica: É possível excluir um conjunto de arquivos do arquivamento especificando padrões. Use –exclude [PATTERN] para excluir arquivos correspondentes a padrões de curingas. Por exemplo, para excluir todos os arquivos .txt do uso de arquivamento:

$ tar -cf arch.tar * --exclude "*.txt"

Observe que o padrão deve ser colocado entre aspas duplas.

---

Dica:

USANDO O COMANDO CPIO PARA CAMINHOS ABSOLUTOS.

Usando o cpio, também podemos arquivar usando arquivos como caminhos absolutos. /usr/somedir é um caminho absoluto, pois contém o caminho completo a partir da raiz (/).

Um caminho relativo não será iniciado com / mas inicia o caminho a partir do diretório atual. Por exemplo, test / file significa que existe um teste de diretório e o arquivo está dentro do diretório de teste.

Ao extrair, o cpio extrai para o caminho absoluto em si. Mas no caso do tar, ele remove o / no caminho absoluto e o converte em caminho relativo.

---

Dica:

FORMATO PATH.

Para o formato PATH, se usarmos / no final da fonte, o rsync copiará o conteúdo desse diretório final especificado no source_path para o destino.

Se estiver no final da fonte, o rsync irá copiar o próprio diretório final para o destino.

---

Dica:

/ NO FINAL DO DESTINATION_PATH.

Se / estiver no final de destination_path, o rsync copiará a origem para o diretório de destino.
Se / não for usado no final do caminho de destino, o rsync criará uma pasta, com nome semelhante ao diretório de origem, no final do caminho de destino e copiará a origem nesse diretório.

---

Dica:

COMANDO DE ESPERA.

O comando wait permite que um script seja finalizado somente após o término ou completo de todos os seus processos-filhos ou processos em segundo plano.
Primeiro argumento do comando sftp

---

Dica:

-oPort deve ser o primeiro argumento do comando sftp.

---

Dica:

EXECUTANDO DU DIRECTORY.

Executar du DIRECTORY irá produzir um resultado similar, mas mostrará apenas o tamanho consumido pelos subdiretórios. No entanto, eles não mostram o uso do disco para cada um dos arquivos. Para imprimir o uso do disco por arquivos, -a é obrigatória.

---

Dica:

COMANDOS DO DIRECTORY DU TRANSVERSAL.

du pode ser restrito para percorrer apenas um único sistema de arquivos usando o argumento –x.
Suponha que du DIRECTORY seja executado, ele percorrerá todos os subdiretórios possíveis de DIRECTORY recursivamente.
Um subdiretório na hierarquia de diretórios pode ser um ponto de montagem (por exemplo, /mnt/sda1 é um subdiretório de /mnt e é um ponto de montagem para o dispositivo /dev/sda1).
du percorrerá esse ponto de montagem e calculará a soma do uso do disco para o sistema de arquivos do dispositivo também.
Para impedir que o du seja percorrido e para calcular a partir de outros pontos de montagem ou sistemas de arquivos, use o sinalizador -x junto com outras du opções.
du –x/ excluirá todos os pontos de montagem em /mnt/ para cálculo de uso do disco.

---

Dica:

ARGUMENTO -X

Dica: O argumento -x junto com -a especifica para remover a restrição TTY transmitida, por padrão, por ps. Geralmente, o uso de ps sem argumentos imprime processos conectados apenas ao terminal.

---

Dica:

PARÂMETROS PARA -o

Dica: Os parâmetros para -o são delimitados usando o operador vírgula (,). Deve-se notar que não há espaço entre o operador vírgula e o próximo parâmetro. Principalmente, a opção -o é combinada com a opção -e (every) (-oe), pois deve listar todos os processos em execução no sistema. No entanto, quando determinados filtros são usados junto com –o, como aqueles usados para listar os processos pertencentes a usuários especificados, -e não é usado junto com –o. O uso de -e com um filtro anulará o filtro e mostrará todas as entradas do processo.

---

Dica:

COMANDO PGREP

O pgrep requer apenas uma parte do nome do comando como seu argumento de entrada para extrair um comando Bash, por exemplo, pgrep ash ou pgrep bas também funcionará. Mas ps requer que você digite o comando exato.

---

Dica:

APROPOS.

Às vezes precisamos procurar se algum comando relacionado a uma palavra existe. Em seguida, podemos pesquisar as páginas de manual por strings no comando. Para isso, podemos usar:

apropos COMMAND

---

Dica:

NOVA LINHA NO COMANDO ECHO: Quando usar -n, quando usar \c.

echo: -n ou \c

Felizmente, isso está se tornando um problema menor, mas vale a pena estar ciente, especialmente se você estiver escrevendo scripts para sistemas Unix mais antigos.

Quando você usa a instrução echo, uma nova linha é adicionada no final do comando. Isto é, se o seu script se parece com isto:

#!/bin/sh
echo Hello
echo World

Então a saída será:

Hello
World

e não:

HelloWorld

---

Dica:

FREQÜENTEMENTE, é exatamente isso que você quer, mas às vezes você quer que o eco não insira essa nova linha automaticamente.

Há uma correção para isso ... bem, com mais precisão, há duas correções para isso.

Primeiro, você precisa estar ciente de que o eco é implementado pela maioria dos shells (como um comando interno do shell) e também pelo sistema operacional (normalmente como /bin/echo). Portanto, o comportamento exato depende de qual shell você está usando, se ele está configurado para usar o eco integrado ou o nativo /bin/echo e, nessa situação, você precisa saber em qual sistema operacional o script está sendo executado e como ele implementa esse recurso.

Algumas implementações usam echo -n message para dizer ao echo para não acrescentar uma nova linha; outros não têm -n, então você tem que usar echo message \c para fazer a mesma coisa. Na maioria das vezes, você vai querer echo -n, mas se você precisa que seu script seja totalmente portátil, você precisa permitir ambos:

#!/bin/sh
echo -n "Enter your name: "
read name
echo "Hello, $name"

---

Dica:

ISSO FUNCIONARÁ EM ALGUNS SISTEMAS E FICARÁ ASSIM:

Digite seu nome: Stevao
Ola stevao

No entanto, em outros sistemas, ficará assim, o que não é ideal:

-n Digite seu nome: Stevao
Ola stevao

Em outros sistemas, você precisa escrever o código assim:

echo "Enter your name: \c"
read name
echo "Hello, $name"

ISSO FORNECERÁ os resultados corretos nesses sistemas, mas poderá fornecer resultados errados em outros sistemas (onde \c não possui nenhum significado especial, será interpretado como um caractere c literal).

Bem, isso é um parto... Aqui está uma solução que funcionará em ambos:

if [ "`echo -n`" = "-n" ]; then
n=""
c="\c"
else
n="-n"
c=""
fi

echo $n "Enter your name: $c"
read name
echo "Hello, $name"

---

Dica:

SE echo -n não fosse interpretado pelo eco, seria exibido apenas o texto literal -n. Em caso afirmativo, $ n é definido como a string vazia e $c é definido como \c.

Neste exemplo, o comando echo $n "Digite seu nome: $c" será analisado como:

echo -n "Enter your name: "

Caso contrário, o echo interpretou -n como um argumento para alterar seu comportamento, portanto, $ n é definido como -n e $c é definido como a cadeia vazia. O comando echo $ n "Digite seu nome: $c" será analisado como:

echo "Enter your name: \c"

DE QUALQUER MANEIRA, O RESULTADO DESEJADO FOI ALCANÇADO.

---

Dica:

SEMPRE EXECUTE A DEPURAÇÃO PARA SCRIPTS LONGOS.

Se você estiver escrevendo scripts bash com milhares de linhas de código, encontrar erros pode se tornar um pesadelo. Para corrigir facilmente as coisas antes de executar um script, execute alguma depuração.

Métodos para ativar o modo de depuração de scripts de shell.

AS OPÇÕES DE DEPURAÇÃO.

As opções principais de depuração do script do shell:

-v (abreviação de detalhado) - informa ao shell para mostrar todas as linhas em um script enquanto elas são lidas, ele ativa o modo detalhado.

-n (abreviação de noexec ou no ecxecution) - instrui o shell a ler todos os comandos, mas não os executa. Esta opção ativa o modo de verificação de sintaxe.

-x (abreviação de xtrace ou rastreio de execução) - informa ao shell para exibir todos os comandos e seus argumentos no terminal enquanto eles são executados.

OBS:
ESTA OPÇÃO (-x) ATIVA O MODO DE RASTREAMENTO DE SHELL.

---

1. MODIFICANDO A PRIMEIRA LINHA DE UM SCRIPT DE SHELL. O primeiro mecanismo é alterando a primeira linha de um script de shell como abaixo, isso permitirá a depuração de todo o script.

#!/bin/sh opção(s)

No formulário acima, a opção pode ser uma ou uma combinação das opções de depuração acima.

2. INVOCANDO O SHELL COM OPÇÕES DE DEPURAÇÃO. A segunda é invocando o shell com opções de depuração da seguinte maneira: esse método também ativará a depuração de todo o script.

shell opções(s) script_nome argumento1 ... argumentoN

Ex:

/bin/bash opções(s) script_nome argumento1 ... argumentoN

3. USANDO O COMANDO INTERNO DO SHELL SET.

O terceiro método é usar o comando interno set para depurar uma determinada seção de um script de shell, como uma função.

Esse mecanismo é importante, pois permite ativar a depuração em qualquer segmento de um script de shell.

Podemos ativar o modo de depuração usando o comando set no formulário abaixo, em que option é uma das opções de depuração.

$ set opção

PARA HABILITAR O MODO DE DEPURAÇÃO, USE:

$ set -option

PARA DESATIVAR O MODO DE DEPURAÇÃO, USE:

$ set + option

ALÉM DISSO, SE TIVERMOS ATIVADO VÁRIOS modos de depuração em diferentes segmentos de um script de shell, podemos desativar todos eles de uma vez da seguinte maneira:

$ set -

É ISSO POR ENQUANTO, COM A ATIVAÇÃO DO MODO DE DEPURAÇÃO DE SCRIPTS DE SHELL. Como vimos, podemos depurar um shell script inteiro ou uma seção específica de um script.

---