cannot move out of output.stdout which is behind a shared reference
move occurs because output.stdout has type Vec<u8>, which does not implement the Copy trait
You take not Output, but &Output - that's the important distinction, since you can't steal the data from behind the reference. If you intend to reuse Output after call to get_stdout, you have to clone the standard output data, i.e. use String::from_utf8(output.stdout.clone()); otherwise, just change the argument to be Output directly.
You can access properties, but you can't move out of them. The Vec<u8> stored in output.stdout must remain unchanged after the call to your function. So, to have your own copy of the data inside it, you have to create that copy explicitly.
Here you try to take stdout from Output (i.e. try to take the ownership of stdout), but because you don't own output (you have a non-mutable reference) and the type of stdout (Vec<u8>) don't implement Copy you cannot do that.
So, you have two options:
borrow the value, i.e. take a non-mutable reference to the field : &output.stdout
clone the data to obtain a owned version : output.stdout.clone()
The point is that when you write output.stdout in the way you're doing here, you are performing a move which destroys the original value. You only have a reference, so you're not allowed to destroy output.stdout.