web-dev-qa-db-ja.com

ddの進行状況を端末でlog.txtファイルにリダイレクトし、プロセス中に端末に表示する方法は?

これが私のスクリプトです:-

Sudo mate-terminal --geometry=50x10 -x sh -c "dd if=/dev/sda of=/dev/sdb status=progress 2>&1 | tee log.txt | md5sum > hash.txt | sha1sum > hash1.txt"

私はいつもこの提案をしている人々を見てきました。 2>&1を入れます。ただし、これはlog.txtファイルの進行状況のみを表示し、ターミナルには何も表示されません。これは、log.txtファイルでの進捗状況の画像です。

logfile

2>&1を削除してそのまま進むと

command | tee log.txt

端末のみが進行状況を表示し、log.txtファイルには何も表示されません

私も試しました:-

(command 2>&1) | log.txt

command 2> | log.txt

そして、もっと思い出せません。だから誰かが私を助けることができますか?

3
Najmi

進行状況は、STDOUTではなくSTDERRに出力されます。書き込み中のファイルでtail -fを実行すると、次のように目的のものを取得できます。

mate-terminal --geometry=50x10 -x sh -c 'tail -f log.txt'
Sudo dd if=/dev/sda of=/dev/sdb status=progress 2> log.txt"

tail -f log.txtは、log.txtに書き込まれているすべてを新しい小さな端末に出力し、バックグラウンドプロセスとして実行するため、実行中により多くのコマンドを発行できます。
2>は、STDERRストリームをlog.txtに送信します。 STDOUTに出力がある場合、コマンドまたはスクリプトの実行元の端末に表示されます。

2
Zanna

Bashで|&を使用してstderrとstdoutの両方をリダイレクトします。

Sudo mate-terminal --geometry=50x10 -x bash -c "dd if=/dev/sda of=/dev/sdb status=progress |& tee log.txt"
2
muru