Zanim grepzobaczy wiersz argumentu, ten argument jest analizowany przez powłokę. W przypadku powłoki *symbol wieloznaczny oznacza „wszystkie pliki bez kropek w bieżącym katalogu”. Ponieważ powłoka obsługuje argument jako pierwszy, twoja linia zmienia się w:
cat abcd | grep abcd otherfile zfile
(zakładając, że te trzy pliki znajdują się w bieżącym katalogu). To właśnie grepwidać z jej argumentów, ale nie jest to, czego chcesz.
Zamiast tego możesz umieścić wzorzec grepw cudzysłowie, aby nie był przetwarzany przez powłokę:
cat abcd | grep "*"
To lepiej, ale wciąż nie to, czego chcesz: grepużywa wyrażeń regularnych, a nie symboli wieloznacznych w stylu powłoki. Gwiazdka grepoznacza, że „0..n powtórzeń poprzedniego znaku” - znak, którego nie określiłeś. Blisko, ale niezupełnie.
Jeśli chcesz mieć „dowolny” wzorzec, szukasz „0..n powtórzeń dowolnego znaku”. Ten ostatni jest reprezentowany przez kropkę ( '.') w wyrażeniach regularnych:
cat abcd | grep ".*"
Tego właśnie szukałeś.
Edycja: Drugi przypadek można łatwiej wyjaśnić. Podczas grep ""gdy szukasz pustego łańcucha, który jest obecny jako podciąg w dowolnym łańcuchu.
_? Na moim komputerze, to daje,_: command not found.