Si quieres esas últimas 10 líneas:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Pero con GNU xargs, también puede establecer el delimitador en nueva línea con:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0es la abreviatura de -d '\0').
Portablemente, también puedes escapar de cada personaje:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
O cita cada línea:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Si desea los 10 últimos registros delimitados por NUL de myFile.txt(pero eso no sería un archivo de texto), tendría que convertir el archivo \na \0antes de llamar, taillo que significaría que el archivo tendrá que leerse completamente:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Editar (ya que cambiaste taila tail -fen tu pregunta):
El último de arriba obviamente no tiene sentido tail -f.
El xargs -d '\n'uno funcionará, pero para los otros, tendrá un problema de almacenamiento en búfer. En:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tralmacena su salida cuando no va a una terminal (aquí, una tubería). Es decir, no escribirá nada hasta que haya acumulado un búfer lleno (algo así como 8 kB) de datos para escribir. Lo myCmdque se llamará en lotes.
En un sistema GNU o FreeBSD, puede alterar el comportamiento de almacenamiento en búfer trcon el stdbufcomando:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2