This behaviour is expected and described in the manual (albeit it might be a good candidate for a FAQ) :
https://www.gnu.org/software/grep/manual/grep.html#Usage Even before grep gets to see the expression, the shell would try to match it and expand it as needed, which is obviously not what you want for your usecase and why it would be better if you quote it. time echo "axyz" | grep '[abcd]xyz' should behave as you expect, regardless of what the current directory has. Carlo