это хороший вопрос. я вот тоже не утруждал себя в чем разница. как-то по практике, если пайп | не работает, то xargs
англоязычный сегмент поясняет: не все команды читают standard input, например
echo $PATH | echo
даст ничего
есть программы, которые читают не вход с пайпа, а лишь ввод от пользователя или только параметры своей командной строки. так, echo понимает параметры echo a b c d . для этих случаев и нужен xargs. Он преобразует свой вход в переменные для указанной программы:
echo $PATH | xargs echo
даст на выходе желаемый результат
echo $xargoutput
ну или типа того )