有一个 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
在同一 shell 命令中存储在变量中以供以后使用。
目标是在一个 shell 命令中创建指向刚刚创建的备份文件的文件夹的符号链接。
到目前为止我已经得到:
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
您的 shell 脚本由另一个 shell 执行,该 shell 是一个子进程。
没有直接的方法将变量从子进程传递到其父进程。
一种方法可能是使用点(“.”)运算符使用当前 shell 执行脚本,但是任何对 exit 的调用都会停止当前 shell,并且您将继承脚本的所有变量:
. ./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=' `
这是另一个解决方案:括号“()”创建一个子 shell 来保护您免受脚本的退出调用和不需要的变量的影响,并且您不必修改脚本:
if ( . ./create_backup.sh && declare -p BACKUP_FILE > /tmp/somefile )
then . /tmp/somefile
ln -s $BACKUP_FILE /folder/here
fi