私のbashファイルには、次の特定のタスクを実行するようになっているいくつかのスクリプトがあります。
#!bin/bash
yum -y update
service restart nginx
yum install atop
cat /var/log/somelog.log > /home/cron/php/script
続行しますが、問題は、各ジョブが実行されるたびに bash が出力を表示することです。たとえば、 service restart nginx
いくつかのメッセージを出力します。このメッセージをすべて隠したいです。これを達成するために一般的に受け入れられる方法は何ですか?なぜなら、STDOUTにリダイレクトしようとしていますが、/dev/null
実行する必要がある50を超える連続タスクがあることを考えると、これはあまりにも多くのタスクを実行する必要があるため、何らかの理由で/dev/null
この方法がそれほど効率的ではないようです。
答え1
すべての出力をブロックにリダイレクトします。
(
yum -y update
service restart nginx
yum install atop
cat /var/log/somelog.log > /home/cron/php/script
) > /dev/null 2>&1
答え2
stdoutとstderrのファイル記述子を保存して上書きし、プログラムの実行後に復元できます。
exec 3>&1
exec 4>&2
exec 1>/dev/null
exec 2>/dev/null
./script-1
./script-2
...
./script-n
exec 1>&3
exec 2>&4
# delete the copies
exec 3>&-
exec 4>&-
答え3
実行中のコマンドのすべての出力(出力とエラーの両方)を非表示にしたいが、まだメッセージを直接印刷できる場合は、Hauke Lagingのアプローチは間違いなく良い方法です。
これにより、stdout(ファイル記述子1とも呼ばれます)とstderr(ファイル記述子2とも呼ばれます)への参照を維持し、それを/ dev / nullにリダイレクトできますが、メッセージを表示したい場合は引き続き使用できます。私はそれが何をしているかを正確に説明するためにいくつかの説明を追加したいと思いました。
exec 3>&1 # Open file descriptor 3, writing to wherever stdout currently writes
exec 4>&2 # Open file descriptor 4, writing to wherever stderr currently writes
exec 1>/dev/null # Redirect stdout to /dev/null, leaving fd 3 alone
exec 2>/dev/null # Redirect stderr to /dev/null, leaving fd 4 alone
# Programs won't show output by default; they write to fd 1 which is now /dev/null.
# This is because programs inherit file descriptors from the shell by default.
echo foo
# You can choose to show messages by having them write to fd 3 (old stdout) instead.
# This works by saying that echo's fd 1 (stdout) is the shell's fd 3.
echo bar >&3
# And when you're done you can reset things to how they were to start with
exec 1>&3 # Point stdout to where fd 3 currently points (the original stdout)
exec 2>&4 # Point stderr to where fd 4 currently points (the original stderr)
exec 3>&- # Close fd 3 (it now points to the same spot as fd 1, so we don't need it)
exec 4>&- # Close fd 4 (it now points to the same spot as fd 1, so we don't need it)
どのサイズのスクリプトでもこれを使用する予定で、作業が進行中の状況の更新を頻繁に印刷する必要がある場合は、元のファイルstdoutとstderrにメッセージを印刷するヘルパー関数を作成することをお勧めecho "$@" >&3
します。echo "$@" >&4
スクリプトに&3
参照を追加する必要はありません。&4
そしてこのbash-hackers.orgリダイレクトチュートリアルこのように、適度に複雑なリダイレクトが実際にどのように機能するかについての良い視覚的な説明です。