일부 파일의 백업을 생성하는 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
쉘 스크립트는 하위 프로세스인 다른 쉘에 의해 실행됩니다.
하위 프로세스에서 상위 프로세스로 변수를 전달하는 직접적인 방법은 없습니다.
한 가지 접근 방식은 점(".") 연산자를 사용하여 현재 셸을 사용하여 스크립트를 실행하는 것일 수 있지만, 종료를 호출하면 현재 셸이 중지되고 스크립트의 모든 변수가 상속됩니다.
. ./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