
$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
によって異なります)。tron
userconfigdir
userdatadir
var
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出力を読み取る内容は何も表示されません。tee
after endまで完全に配信されたとすればwhile
何か新しいことを学んだわけだ。
C. 無限ループで $tron コマンドをできるだけ早く実行したいですか?多くのシステムでは、最終的に少なくとも1つのCPU全体の容量を消費します。 1つ追加しますかsleep 1
?
達成したいタスクの詳細情報を追加すると便利です!頑張ってください。