2つのバックアップスクリプトを作成しました。 1つはファイル用(filebackup.sh)、もう1つはデータベース用(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.sh
inの出力をさらにリダイレクトすると、dbbackup.sh >&/dev/null
2番目のリダイレクトはecho
コマンドに影響しません。