is there a way to prevent a user from executing the "SHOW VIEW" command and not seeing the view definition or any of the columns in it?
If the user holds any permission on the view (including SELECT), then SHOW is also allowed.
If you need to hide the SELECT statement logic, you could create two levels of views; i.e. V1 has the logic and V2 is just a "SELECT * FROM V1".
Then give the user access to V2 but not no access to V1.