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));
 }

Reply via email to