tail を使用する場合、改行を null 区切りに変換します。

tail を使用する場合、改行を null 区切りに変換します。

tail改行の代わりにヌル終了行を使用するように出力を変更するにはどうすればよいですか?

私の質問は次のようなものです:bash で null 区切りの入力に対して `head` と `tail` を実行するにはどうすればよいでしょうか?ですが、次のようなことをしたいという点で異なります。

tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"

使用していないfindので使用できません-print0

これらはすべて、xargs で発生するエラーを回避するためのものです。

xargs: unmatched double quote;
    by default quotes are special to xargs unless you use the -0 option

答え1

最後の 10 行が必要な場合:

tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

しかし、GNU ではxargs、次のようにして区切り文字を改行に設定することもできます。

tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2

(-0は の略です-d '\0')。

移植性を高めるために、単純にすべての文字をエスケープすることもできます。

tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2

または各行を引用します:

tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2

の最後の 10 個の NUL 区切りレコードが必要な場合(ただし、その場合はテキスト ファイルではありません)、 を呼び出す前にを にmyFile.txt変換する必要があります。つまり、ファイルを完全に読み取る必要があります。\n\0tail

tr '\n\0' '\0\n' < myFile.txt |
  tail |
  tr '\n\0' '\0\n' |
  xargs -r0i myCmd {} arg1 arg2

編集(質問の を にtail変更したため):tail -f

上記の最後のものは、明らかに には意味をなさないtail -f

1xargs -d '\n'つは動作しますが、他の場合はバッファリングの問題が発生します。

tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

tr出力がターミナル (ここではパイプ) に送信されない場合、出力をバッファリングします。つまり、書き込むデータがバッファ一杯 (8kiB 程度) 蓄積されるまで、何も書き込まれません。つまり、myCmdバッチで呼び出されることになります。

GNU または FreeBSD システムでは、tr次のstdbufコマンドを使用してバッファリングの動作を変更できます。

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

関連情報