grep reads from standard input when no files are specified. It also does so when -R is used, which doesn't really make sense. I think using the current working directory as a fallback when no directories are specified would make sense. POSIX says "If no file operands are specified, the standard input shall be used.", but -R is an extension to POSIX, so I guess it is not bound by that.
Far too often I've started a grep -R and waiting for the output, only to recognize minutes later, that I forgot to add the '.' at the end of the command and it is reading from stdin. Any thoughts? OK? cheers, natano Index: grep.1 =================================================================== RCS file: /cvs/src/usr.bin/grep/grep.1,v retrieving revision 1.43 diff -u -p -r1.43 grep.1 --- grep.1 13 Jan 2015 04:45:34 -0000 1.43 +++ grep.1 29 Apr 2015 20:09:15 -0000 @@ -238,6 +238,7 @@ will only search a file until a match ha making searches potentially less expensive. .It Fl R Recursively search subdirectories listed. +If no directories are specified, the current working directory is used. .It Fl s Silent mode. Nonexistent and unreadable files are ignored Index: grep.c =================================================================== RCS file: /cvs/src/usr.bin/grep/grep.c,v retrieving revision 1.50 diff -u -p -r1.50 grep.c --- grep.c 16 Mar 2015 13:27:59 -0000 1.50 +++ grep.c 29 Apr 2015 20:09:15 -0000 @@ -481,14 +481,17 @@ main(int argc, char *argv[]) if ((argc == 0 || argc == 1) && !Rflag && !Hflag) hflag = 1; - if (argc == 0) - exit(!procfile(NULL)); - if (Rflag) - c = grep_tree(argv); - else + if (Rflag) { + char *cwd[] = {".", NULL}; + c = grep_tree(argc ? argv : cwd); + } else { + if (argc == 0) + exit(!procfile(NULL)); + for (c = 0; argc--; ++argv) c += procfile(*argv); + } exit(c ? (file_err ? (qflag ? 0 : 2) : 0) : (file_err ? 2 : 1)); }