Store variable from output bash

0

Tenho um script bash para criar um backup de alguns arquivos, é definido em Cron.

O comando bash, incluindo a saída, é:

[vagrant@localCentOS71 ~]$ sudo create_backup.sh
Check if all is good ...
done
Doing it ..
Backup file is: 1482419092_backup.tar ... Yeah!
done

Como posso armazenar 1482419092_backup.tar em uma variável, para uso posterior, no mesmo comando shell.

O objetivo é criar um link simbólico para uma pasta do arquivo de backup recém-criado, em um comando de shell.

Até agora eu tenho:

create_backup.sh && ln -s $BACKUP_FILE /folder/here
    
por Kevin 22.12.2016 / 16:14

2 respostas

1

Seria muito mais simples editar o script, mas se isso não for possível, você pode fazer:

BACKUP_FILE=$(create_backup.sh | grep -oP 'Backup file is:\s*\K\S+') && 
ln -s $BACKUP_FILE /folder/here
    
por 22.12.2016 / 16:51
0

Seu shell script é executado por outro shell, que é um subprocesso.

Não há um caminho direto para passar uma variável do processo filho para o pai.

Um método poderia ser executar o script com seu shell atual com o operador dot ("."), mas qualquer chamada para sair interromperá seu shell atual e você herdará todas as variáveis do seu script:

. ./create_backup.sh && ln -s $BACKUP_FILE /folder/here

A melhor maneira é usar o arquivo para armazenar sua variável.

Em algum ponto do seu script, você salva o valor da variável:

declare -p BACKUP_FILE > /tmp/somefile.sh

ou:

echo BACKUP_FILE=\""$BACKUP_FILE"\" > /tmp/somefile.sh

Então você pode executar:

if ./create_backup.sh
then . /tmp/somefile.sh
     ln -s $BACKUP_FILE /folder/here
fi

Outra maneira sem arquivos, poderia ser ler o stdin do script:

OUTSCRIPT=' ./create_backup.sh | grep 'BACKUP_FILE=' '

Aqui está uma outra solução: o parêntese "()" cria um sub-shell para protegê-lo das chamadas de saída e variáveis indesejadas do script E você não precisa modificar o script:

if ( . ./create_backup.sh && declare -p BACKUP_FILE > /tmp/somefile )
then . /tmp/somefile
     ln -s $BACKUP_FILE /folder/here
fi
    
por 22.12.2016 / 18:04