Steps to reprocude:
1. Place down a repeating command block (unconditional, always active).
2. Paste the current command inside /execute @a ~ ~ ~ detect ~ ~-1 ~ grass 0 say hi
What I expected to happen:
I expected the command to only run when a player is standing on a grass block.
The command runs ALWAYS, even if the player isn't on a grass block. After some research I found out that the command block checks the block underneath itself.