The pipe redirects the echo output to the following command.
If you want both the terminal and "say" then you must duplicate it.
One method is "tee" that writes to stdout AND to a file.
And if the file is a special file that forwards to the terminal then it prints immediately.
Code:
xargs echo < quotes.txt | tee /dev/tty | say
xargs does nothing but changing embedded newlines to spaces. Perhaps you can skip it?
Code:
tee /dev/tty < quotes.txt | say
Another special file is a "process substitution":
Code:
{ tee >( cat >&3 ) < quotes.txt | say; } 3>&1
Of course you can save an output to a file (redirection) or a variable (command substitution) and use the file or variable twice.
In this case you have a file already.
Code:
fn=quotes.txt; cat "$fn"; cat "$fn" | say