echo imprime seus argumentos e ignora stdin . <<EOF ... EOF (um documento aqui / heredoc ) escreve para stdin . Como você percebeu, cat lê stdin (e escreve), então lê o heredoc. Como sa-learn lê a partir de stdin , ele também lê o heredoc .