Тире - это специальный символ в Bash, как отмечалось на http://tldp.org/LDP/abs/html/special-chars.html#DASHREF. Так что экранирование этого раза приведет тебя к Bash, но Grep все еще имеет свое значение для тире (предоставляя опции).
Так что вам действительно нужно дважды избежать этого (если вы предпочитаете не использовать другие упомянутые ответы). Следующее будет / должно работать
grep \\-X
grep '\-X'
grep "\-X"
Один из способов проверить, как Bash передает аргументы скрипту / программе, - это создать скрипт .sh, который просто повторяет все аргументы. Я использую сценарий echo-args.sh, чтобы время от времени играть с ним, все что он содержит:
echo $*
Я называю это как:
bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"
Вы поняли идею.