これはシェルスクリプトの私のコマンドです。すべての出力を標準ログファイルにリダイレクトしたいと思います。ディレクトリまたはサブディレクトリを含む* .txtファイルが見つからない場合は、std出力画面にo / pを書き込むことを除いて、優れた作業を行います。これを抑制してログファイルに送信するにはどうすればよいですか?
TOTALFILES=`ls $SOURCEDIR/$SOURCESUBDIR/*.txt| wc -l` >> $WORKDIR/$LOGFNAME
ベストアンサー1
それ確かに「標準出力にo/pを書く」。stderr
また、ファイルに標準出力も書きません。コマンド置換を使用すると、stdoutを変数に書き込むように指示しますTOTALFILES
。
出力を変数とファイルの両方に移動するには、以下を使用する必要がありますtee
。
totalfiles=$(ls "${sourcedir}/${sourcesubdir}/"*.txt | wc -l | tee "${workdir}/${logfname}")
ただし、これはstderrをログファイルに送信せず、次のことができます。
totalfiles=$(ls "${sourcedir}/${sourcesubdir}/"*.txt 2>"${workdir}/${logfname}" | wc -l | tee "${workdir}/${logfname}")
stdinはfd0
stdoutはfd1
stderrはfd2
標準出力リダイレクト:
foo > /path/file
これは次のとおりです。
foo 1> /path/file
標準エラーリダイレクト:
foo 2> /path/file
両方ともリダイレクトするには:
foo > /path/file 2>&1
リダイレクトの順序が重要です。
読む: 3.6 リダイレクト
&>
Bashを使用すると、次のコマンドを使用してこの時間を短縮することもできます。
foo &> /path/file
(変数名を大文字として使用しないでください。代わりに、すべての変数を引用して$( ... )
バックティックを使用する必要があります。