Se você deseja as últimas 10 linhas:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Mas com o GNU xargs, você também pode definir o delimitador para nova linha com:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0é a abreviação de -d '\0').
Portably, você também pode simplesmente escapar de todos os personagens:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Ou cite cada linha:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Se você quiser os 10 últimos registros delimitados por NUL de myFile.txt(mas isso não seria um arquivo de texto), será necessário converter o arquivo \npara \0antes de chamar, o tailque significa que o arquivo terá que ser lido completamente:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Editar (desde que você alterou o tailpara tail -fna sua pergunta):
O último acima, obviamente, não faz sentido tail -f.
O xargs -d '\n'deles irá funcionar, mas para os outros, você vai ter um problema buffering. Em:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tramortece sua saída quando não vai para um terminal (aqui, um tubo). IE, ele não escreverá nada até que tenha acumulado um buffer completo (algo como 8kiB) de dados para gravação. Quais meios myCmdserão chamados em lotes.
Em um sistema GNU ou FreeBSD, você pode alterar o comportamento do buffer trcom o stdbufcomando:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2