Você precisa fazer
while IFS= read -r line
Definir o IFS como a string vazia preservará o espaço em branco.
Usar -r
preservará as sequências de barra invertida no texto.
Se o desempenho for uma preocupação, observe que um loop while read
é muito lento no bash. Se você quiser injetar a entrada em linhas, e o consumo de memória não for um problema, leia a entrada em uma matriz de linhas:
mapfile -t lines < x.tmp
for line in "${lines[@]}"; do
do_something_with "$line"
done