Catch the error returned from `shell_out!`

Adding the output redirect has changed the nature of the `shell_out`
execution. We need to catch the exception raised by the `shell_out!` method
in order to proceed if there is an error.
Switch to argument-based accessor for `last_match`

When calling `last_match` and not passing an index to the method, it
returns all of the matchers. This was being used to access the matcher
based on the index array. However, if there is a problem and last_match
returns `nil`, then the array accessor raises an error. Passing an
argument to `last_match` returns nil if no result is present at that
position.