쉘 스크립트는 사용자 입력 없이 stdout의 마지막 줄을 화면에 그리지 않습니다.

쉘 스크립트는 사용자 입력 없이 stdout의 마지막 줄을 화면에 그리지 않습니다.

모든 백업 프로세스를 성공적으로 수행하고 진행 상황을 stderr 및 stdout에 기록하는 쉘 스크립트가 있습니다. 단, 한 가지 예외는 을 클릭할 때까지 마지막 줄이 터미널에 기록되지 않는다는 것입니다(스크립트를 수동으로 호출하는 경우) Enter.

이제 이것은 큰 문제가 아니지만 이것이 수행되지 않는다는 것이 정말 짜증나기 때문에 이것이 왜 수행되는지 이해하고 싶습니다.

(을 클릭한 후) 출력에 기록되는 내용은 Enter다음과 같습니다.

[blackero@XXXXXXXXXXXXXXXX ~]$ fullbackup.sh
Tue Feb 28 17:57:41 GMT 2012
Tue Feb 28 17:57:41 GMT 2012
Starting SITE_NAME backup
maintenance_mode was set to 1.                                                    [success]
/home/blackero/bin/fullbackup.sh: line 36: hash: lzma: not found
maintenance_mode was set to 0.                                                    [success]

Backup for SITE_NAME created


[blackero@XXXXXXXXXXXXXXXX ~]$

스크립트의 관련 부분은 다음과 같습니다( 읽기 쉽도록 코드를 래핑했음을 의미).

#!/bin/bash
date
date 2>&1

# [A bunch of content has been deleted from here]

# Compress with lzma if available, otherwise use gzip
if hash lzma; then
  lzma -c ${backup_dest}/${dbname} >${backup_dest}/${dbname}.lzma
  ↪  && rm ${backup_dest}/${dbname}
else
  gzip -c ${backup_dest}/${dbname} >${backup_dest}/${dbname}.gz
  ↪  && rm ${backup_dest}/${dbname}
fi

# Disable maintenance mode.
drush -r ${drupal_root} vset --always-set maintenance_mode 0

# Remove old backups >30 days
find ${backup_dest} -mtime +30 -exec rm {} \; >> /dev/null 2>&1

echo "Backup for ${sitename} created"
echo
echo 2>&1

if hash lzma; then따라서 해당 줄에 stderr이 표시되도록 하는 줄을 볼 수 있습니다 hash: lzma: not found(이 메시지를 억제하여 해당 경고를 쓰지 않도록 할 수 있다면 좋을 것 같지만 그래도 견딜 수는 있습니다). 해당 행이 drush표준 maintenance_mode was set to 0.출력 에 기록되는 것을 볼 수 있습니다 . 하지만 Backup for SITE_NAME created클릭해야만 선이 나타납니다 Enter.

이전 명령이 stdout을 로 리디렉션했기 때문입니까 /dev/null? 어떻게든 해당 리디렉션을 실행 취소해야 합니까? (스트림 리디렉션은 개별 명령에만 자동으로 영향을 미치는 것 같습니다.)

(경고: 참고: 이 스크립트가 cron에서 실행되면 stdout 및 stderr이 로그 파일에 추가되도록 리디렉션되고 모든 것이 로그 파일에 기록되며 터미널 입력이 필요하지 않습니다. 이 스크립트는 원래 다음에서 나왔습니다.Drupal 관리 가이드:fullsitebackup_drush;많이 편집했는데 코드가 거기에서 나온 것입니다 lzma. gzip)

답변1

백업 파일이 읽기 전용인 경우 rm실행하는 명령은 find백업 파일을 삭제해야 하는지 확인하라는 메시지를 표시할 수 있습니다. 프롬프트를 /dev/null로 리디렉션했기 때문에 프롬프트가 표시되지 않습니다. 누른 키가 Enter읽혀집니다 rm( rm파일을 삭제하지 않는다는 기본 응답이 적용됩니다).

이 가정이 맞다면 두 가지 방법 중 하나로 문제를 해결할 수 있습니다. 하나는 휴대 가능하지만 안전하지 않으며, 다른 하나는 휴대 가능하지만 더 안전합니다. 이 경우 보안 차이는 작을 수 있지만(공격자가 ${backup_dest}에 심볼릭 링크를 생성하지 못할 수 있으므로) 다음 두 가지 옵션을 권장합니다.

안전한:

find "${backup_dest}" -depth -mtime +30 -delete

가지고 다닐 수 있는:

find "${backup_dest}" -depth -mtime +30 \
  '(' '(' -type d -exec rmdir {} \; -true ')' -o -exec rm -f {} \; ')'

마지막으로, 문자 장치를 검색할 수 없기 때문에 문자 장치에 추가하는 것과 문자 장치에 쓰는 것 사이에 차이가 없으므로 ""> /dev/null" 대신 ">> /dev/null"을 사용할 필요가 없습니다.

관련 정보