/dev/tty의 출력을 변수에 넣습니다.

/dev/tty의 출력을 변수에 넣습니다.

두 개의 백업 스크립트를 만들었습니다. 하나는 파일용(filebackup.sh)이고 다른 하나는 데이터베이스용(dbbackup.sh)입니다. 변수에 출력을 filebackup.sh호출 하고 저장했습니다. dbbackup.sh반환된 출력은 dbbackup.sh스크립트가 모든 백업 데이터베이스를 저장하는 tar 파일 이름입니다.

스크립트 의 끝에는 dbbackup.sh다음이 포함됩니다.

echo $TARFILE > /dev/tty

스크립트는 filebackup.sh다음과 같이 dbbackup.sh를 호출합니다.

DBBACKUP="`/scripts/dbbackup.sh &>/dev/null`"

그러면 스크립트의 모든 추가 출력이 /dev/null로 덤프되고 파일 이름만 반환됩니다.

filebackup.sh를 호출할 때 파일 이름이 화면에 인쇄되는 것을 제외하면 모든 것이 잘 작동합니다. 이 변수는 $DBBACKUP비어 있습니다. 내가 여기서 뭘 잘못하고 있는 걸까?

답변1

즉, 에서 해당 >/dev/tty부분을 제거하고 dbbackup.sh다음을 사용하십시오.

echo $TARFILE

이는 $TARFILE을 표준 출력으로 인쇄합니다. 즉, 터미널에서 실행 중인 경우 화면에 인쇄 하거나 리디렉션이 있는 경우 파일/파이프에 인쇄합니다( dbbackup.sh셸 백틱/ 확장 $(...)에서 발생하는 것처럼).

위의 문제를 수정했는데도 함수가 작동하지 않는 또 다른 이유가 있습니다. dbbackup.sh스크립트가 tar 파일 이름을 표준 출력에 인쇄하지만 다음 줄에 있습니다.

DBBACKUP="`dbbackup.sh >&/dev/null`"

dbbackup.sh의 모든 출력을 로 리디렉션하여 삭제합니다 /dev/null. 오류만 삭제하려면 2>/dev/null리디렉션을 사용하세요.

더 긴 이야기: 선

echo $TARFILE > /dev/tty

스크립트의 다른 명령이 공유하는 표준 출력 스트림으로 인쇄하는 대신 명령의 출력을 echo현재 /dev/tty프로세스가 연결된 터미널로 리디렉션합니다 dbbackup.sh. 따라서 dbbackup.shin 의 출력을 추가로 리디렉션하면 dbbackup.sh >&/dev/null두 번째 리디렉션은 echo명령에 영향을 주지 않습니다.

더 읽어보고 싶을 수도 있습니다쉘 리디렉션그리고명령 대체.

관련 정보