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

쉘 스크립트는 하위 프로세스인 다른 쉘에 의해 실행됩니다.

하위 프로세스에서 상위 프로세스로 변수를 전달하는 직접적인 방법은 없습니다.

한 가지 접근 방식은 점(".") 연산자를 사용하여 현재 셸을 사용하여 스크립트를 실행하는 것일 수 있지만, 종료를 호출하면 현재 셸이 중지되고 스크립트의 모든 변수가 상속됩니다.

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

관련 정보