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
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
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
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