シェルスクリプトは、ユーザー入力なしでstdoutの最後の行を画面に描画しません。

シェルスクリプトは、ユーザー入力なしでstdoutの最後の行を画面に描画しません。

すべてのバックアッププロセスを正常に実行し、進行状況をstderrとstdoutに記録するシェルスクリプトがあります。ただし、1つの例外は、をクリックするまで最後の行が端末に書き込まれないことです(スクリプトを手動で呼び出す場合)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;たくさん編集しましたが、コードがそこから出てきますlzmagzip)

答え1

バックアップファイルが読み取り専用の場合、rm実行するコマンドはfindバックアップファイルを削除する必要があることを確認するように求められます。プロンプトを/ dev / nullにリダイレクトしたため、プロンプトは表示されません。押したキーがEnter読み込まれますrmrmファイルを削除しないというデフォルトの応答が適用されます)。

この仮定が正しい場合は、2つの方法のいずれかで問題を解決できます。 1つはポータブルですが安全ではなく、もう1つはポータブルですが、より安全です。この場合、セキュリティの違いは小さいかもしれません(攻撃者が$ {backup_dest}にシンボリックリンクを作成できない可能性があるため)、次の2つのオプションをお勧めします。

安全:

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

持ち運べる:

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

最後に、文字デバイスを検索できないため、文字デバイスに追加するものと文字デバイスに書き込むことに違いはありません。

関連情報