:: Dicas Linux Shell Script ::
---
Vamos dar uma olhada em algumas dicas e truques sobre como trabalhar com o shell script do Linux.
---
: 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).
---
: FORK BOMB...
---
:(){:|:&};:
---
Dica: 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.
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.
---
: ESPECIFIQUE -maxdepth e -mindepth como o terceiro argumento...
Dica: -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, 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.
---
-exec COM VÁRIOS COMANDOS
Dica: Não podemos usar vários comandos junto com o parâmetro –exec. Aceita apenas um único comando, mas podemos usar um truque. Escreva vários comandos em um script de shell (por exemplo, commands.sh) e use-o com –exec da seguinte forma:
-exec ./commands.sh {} ;
---
-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.
---
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.
---
: PESQUISE RECURSIVAMENTE MUITOS ARQUIVOS...
Dica: Para pesquisar recursivamente por um texto sobre vários diretórios de descendentes, use:
$ grep "text" . -R -n
Este é um dos comandos mais utilizados pelos desenvolvedores. Ele é usado para localizar o arquivo do código-fonte no qual um determinado texto existe.
---
: COLOCAR ATRIBUIÇÕES DE VARIÁVEIS...
Dica: 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.
---
ARGUMENTO -d
Dica: O argumento -d sempre deve ser fornecido entre aspas. Se aspas não forem usadas, & é interpretado pelo shell para indicar que este deve ser um processo em segundo plano.
---
: 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.
---
: USANDO O COMANDO CPIO PARA CAMINHOS ABSOLUTOS...
Dica: 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.
---
: FORMATO PATH...
Dica: 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.
---
/ NO FINAL DO DESTINATION_PATH
Dica: 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.
---
: COMANDO DE ESPERA...
Dica: 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.
---
: EXECUTANDO DU DIRECTORY...
Dica: 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.
---
: COMANDOS DO DIRECTORY DU TRANSVERSAL...
Dica: 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.
---
: 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.
---
: 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.
---
: 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.
---
: COMANDO PGREP...
Dica: 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.
---
: APROPOS...
Dica: À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
---
NEWLINE IN 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
---
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"
---
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 é uma dor. 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"
---
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.
---
Até Breve!
🙂
.