Bash出力で変数を保存する

Bash出力で変数を保存する

一部のファイルのバックアップを生成するbashスクリプトがCronに設定されています。

bashコマンド(出力を含む)は次のとおりです。

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

1482419092_backup.tar同じシェルコマンドで後で使用するために変数に保存する方法 。

目的は、作成したばかりのバックアップファイルのフォルダへのシェルコマンドのシンボリックリンクを作成することです。

これまで私は以下を持っています:

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

答え1

スクリプトを編集する方がはるかに簡単かもしれませんが、これが不可能な場合は、次のようにすることができます。

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

答え2

シェルスクリプトは、子プロセスである他のシェルによって実行されます。

子プロセスから親プロセスに変数を渡す直接的な方法はありません。

1つのアプローチは、ドット( ".")演算子を使用して現在のシェルを使用してスクリプトを実行することですが、終了を呼び出すと現在のシェルが停止し、スクリプト内のすべての変数が継承されます。

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

より良いアプローチは、ファイルを使用して変数を保存することです。

スクリプトのある時点で変数の値を保存します。

declare -p BACKUP_FILE > /tmp/somefile.sh

または:

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

その後、次を実行できます。

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

ファイルがない別の方法は、スクリプトの標準入力から読むことです。

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

別の解決策は次のとおりです。 「()」角括弧は、スクリプトの終了呼び出しと不要な変数からユーザーを保護するサブシェルを生成するため、スクリプトを変更する必要はありません。

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

関連情報