Como chamar um script dentro do outro?

1. Como chamar um script dentro do outro?

Marcos Renan Gomes de Medeiros
rnngomes

(usa Outra)

Enviado em 17/10/2018 - 08:47h

Por exemplo:
Criei o arquivo teste.sh: Este recebe um nome de arquivo como argumento de linha de comando. Caso o arquivo
exista, deve chamar o script sucesso.sh. Caso contrário deve chamar o script falha.sh.

Sei que irei usar os conectores && e ||, mas o problema é na hora de chamar outro script.



  


2. Re: Como chamar um script dentro do outro?

Walker Luiz de Freitas
WalkerPR

(usa Deepin)

Enviado em 17/10/2018 - 09:46h

Abaixo repasso um script que uso no CRONTAB o qual trabalha com agendamento diário. Este realiza backup em disco externo. Para chamar outros scripts, eu utilizo o argumento CASE para as condições (vários .SH a chmar, um a cada dia).

Espero que o script o ajude a sanar suas dúvidas.


#!/bin/bash

echo "Rotina de backup SEAGATE executada!" > /var/log/processos/Report_Backup_Seagate.log

VERIFICA=$(blkid -o value -s LABEL /dev/sdd1)
LOG=1

if [ "$VERIFICA" == "Seagate Expansion Drive" ];
then
cd /mnt
mkdir /mnt/seagate_drive
mount -t ntfs-3g /dev/sdd1 /mnt/seagate_drive -o uid=1000

TAMANHO=$(df -h | grep 'sdd1' | awk '{print $5}' | cut -f1 -d%)

# Verificando espaco em disco removivel se acima de 49%.
if [ "$TAMANHO" -lt "49" ];
then
LOG=2
echo "$(date). . .processo SEAGATE executado. . .unidade fisica montada e backup iniciado." >> /var/log/processos/BackupManualSeagate.log

DIA=$(date +%w)

echo $DIA

case $DIA in
0) echo "$(date). . .processo SEAGATE executado. . .sem programacao de backup." >> /var/log/processos/BackupManualSeagate.log;;
1) /srv/scripts/backup_segunda.sh;;
2) /srv/scripts/backup_terca.sh;;
3) /srv/scripts/backup_quarta.sh;;
4) /srv/scripts/backup_quinta.sh;;
5) /srv/scripts/backup_sexta.sh;;
6) echo "$(date). . .processo SEAGATE executado. . .sem programacao de backup." >> /var/log/processos/BackupManualSeagate.log;;
*) echo "$(date). . .processo SEAGATE executado. . .opcao de dia da semana invalido." >> /var/log/processos/BackupManualSeagate.log;;
esac

echo "$(date). . .processo SEAGATE executado. . .unidade fisica desmontada e backup finalizado." >> /var/log/processos/BackupManualSeagate.log
else
echo "$(date). . .processo SEAGATE executado. . .ABORTADO! - Pouco espaco no disco." >> /var/log/processos/BackupManualSeagate.log
umount /mnt/seagate_drive
rmdir /mnt/seagate_drive
fi

else
echo "$(date). . .processo SEAGATE executado. . .ERRO! - Unidade de disco Seagate nao localizada." >> /var/log/processos/BackupManualSeagate.log

fi

tail -${LOG} /var/log/processos/BackupManualSeagate.log >> /var/log/processos/Report_Backup_Seagate.log

#



--------------------------------------------------------------
"Linux: several flavors, a single option: -Freedom of choice!"


3. Re: Como chamar um script dentro do outro?

Slackjeff
slackjeff

(usa Slackware)

Enviado em 17/10/2018 - 12:28h

AO inves de chamar um script o qual irá abrir uma subshell para executar utilize o 'source' ou o '.' e crie uma função externa, o source ou . irá puxar a biblioteca para dentro do mesmo processo, não abrindo uma subshell.
Exemplo:

# Carregando bibliotecas
source sucesso.sh
source falha.sh

# Se arquivo existir
[ -e "arquivo" ] && _FUNCAO_SUCESSO || _FUNCAO_FALHA


Ou você pode por as funções dentro do primeiro programa mesmo e fazer a mesma chamada, retirando o source.
Uma outra alternativa seria não por as bibliotecas dentro de funções e fazer as chamadas.

# Aqui não por a(s) bibliotecas dentro de uma função, criar apenas um simples script
# O source se encarrega do resto.
[ -e "arquivo" ] && source sucesso.sh || source falha.sh


E não se esqueça que tudo que você trampar dentro de um script externo e chamar pelo source ele trará para o processo pai. Ou seja se você dar um exit no meio do programa dentro da biblioteca o script sairá.

Resumo da historia, EVITE chamar script com "bash script.sh" "sh script.sh" "./script" dentro de um script pai. Isto é lento e abre subprocessos tornando os mesmo LENTOS. Sem falar que é totalmente anti profissional.


I'M ROOT!

Slackware user since ~2008
Meu canal no youtube:
https://www.youtube.com/SlackJeff

Meu Site:
https://www.slackjeff.com.br/

Meus Programas estão aqui:
https://notabug.org/jeffersonrocha








4. Re: Como chamar um script dentro do outro?

Walker Luiz de Freitas
WalkerPR

(usa Deepin)

Enviado em 17/10/2018 - 13:41h

slackjeff escreveu:
AO inves de chamar um script o qual irá abrir uma subshell para executar utilize o 'source' ou o '.' e crie uma função externa, o source ou . irá puxar a biblioteca para dentro do mesmo processo, não abrindo uma subshell.
Exemplo:

[code]# Carregando bibliotecas
source sucesso.sh
source falha.sh

. . .

Resumo da historia, EVITE chamar script com "bash script.sh" "sh script.sh" "./script" dentro de um script pai. Isto é lento e abre subprocessos tornando os mesmo LENTOS. Sem falar que é totalmente anti profissional.
. . .


Olá slackjeff,

Eu já havia lido sobre o assunto em outras ocasiões, mas quando montei o script acima na época, acabei esquecendo deste detalhe. Até vou modificá-lo quando tiver um tempo nesta semana.

Realmente, [dica] muito importante!

--------------------------------------------------------------
"Linux: several flavors, a single option: -Freedom of choice!"






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts