teeとgrep(シェル)を同時に使用しますか?

teeとgrep(シェル)を同時に使用しますか?

$log(txtファイル)に書き込んでから、ログファイルで「[1]」で始まるすべてのテキストを見つけて、別のファイルに保存するサーバーを実行しようとしています。これが私の試みです。tee -a $log他のすべてと連携します。 grepコマンドはそうではありません。

run="tail -n0 -f -s 0.01 $cmds | (while true; do $tron --userconfigdir $userconfigdir --userdatadir $userdatadir --vardir $var; done) | tee -a $log | grep '^[1]' > ${var}logs/chatlogs.log"

tee -a $log「[1]」から始まるすべてのテキストを別のファイルにコピーするにはどうすればよいですか?

答え1

コマンドを文字列に入れないでください。複合コマンドを定義する方法は関数です。

その後、シェルプログラミングの最も重要なルールを覚えておいてください。つまり、変数の置換には常に二重引用符を入れてください(例:)"$foo"

次のコードがあります(変数cmds、、、logによって異なります)。tronuserconfigdiruserdatadirvar

run () {
  tail -n0 -f -s 0.01 "$cmds" |
  while true; do
    "$tron" --userconfigdir "$userconfigdir" --userdatadir "$userdatadir" --vardir "$var"
  done |
  tee -a "$log" |
  grep '^[1]' > "${var}logs/chatlogs.log"
}

これでコードが読める形式なので、$tron無限ループで実行されていることがわかります。正確に何をしたいのかわかりませんが、そのループに終了条件を追加する必要があります。

答え2

[...]文字リストの演算子です。あなたはそれをしたいかもしれませんgrep '^\[1\]'

答え3

角かっこを避ければ十分だと思います。grep '^\[1\]'

答え4

まず、シェルのデバッグオプションを使用して、set -vx変数の評価方法やタイミングなどを確認してください。

申し訳ありませんが、なぜコードがこのように設定されていますか?

 run="..."? 

後でその変数を使いたいからですか$run

その場合は、ほぼ確実にこれを行う必要があります。

eval "$run"

これは、特殊文字エスケープの観点から全く新しいウォーム缶を開きます。他のコメント作成者が指摘したように、目的の文字をエスケープする必要があるだけでなく、その文字を2回エスケープする必要があります。過去にこのようなタスクを実行したときに、タスクを実行\\\\\するためにおそらく(5!)のようなエスケープを使用することになったでしょう。

このコードのコンテキストをさらに説明することなく、このコードを無視してそのままrun=実行することをお勧めしますtail -n0 -f -s 0.01 $cmds |....

また、Gilesのコメントに沿って拡大してみると、パイプライン全体があまり意味がありません。

 tail -n0 -f -s 0.01 $cmds | (while true; do $tron ....

A.私たちはその中に何が入っているのかわかりません。$cmds

(while true; ...)B.サブシェルでは、tail cmd出力を読み取る内容は何も表示されません。teeafter endまで完全に配信されたとすればwhile何か新しいことを学んだわけだ。

C. 無限ループで $tron コマンドをできるだけ早く実行したいですか?多くのシステムでは、最終的に少なくとも1つのCPU全体の容量を消費します。 1つ追加しますかsleep 1

達成したいタスクの詳細情報を追加すると便利です!頑張ってください。

関連情報