一部のファイルのバックアップを生成する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