Op Wed, 15 Jun 2011 16:52:12 +0200 schreef Jan Stary <[email protected]>:
The manpage of cp says

-f For each existing destination pathname, remove it and create a
             new file, without prompting for confirmation, regardless of its
             permissions.  This option overrides any use of -i.

-i Write a prompt to the standard error output before copying a file
             that would overwrite an existing file.  If the response from the
             standard input begins with the character `y', the file copy is
             attempted.

but that isnot what cp actually does:

$ rm -f echo bar
$ echo new > foo
$ echo old > bar
$ cp -fi foo bar
overwrite bar? n
$ cat bar
old

Accoording to the manpage, the '-f' should have overrided the '-i'.
Instead, it asked for confirmation, which said 'n', and cp(1) did
not copy foo over bar, as it still has the old content.

Manpage has been like this forever. Looks like the behaviour has been bugged since 1999:

--- src/bin/cp/cp.c     1998/07/03 17:43:56     1.12
+++ src/bin/cp/cp.c     1999/05/06 18:19:45     1.13
@@ -91,7 +91,7 @@ static char rcsid[] = "$OpenBSD: cp.c,v 1.12 1998/07/0
 PATH_T to = { to.p_path, "" };

 uid_t myuid;
-int Rflag, iflag, pflag, rflag;
+int Rflag, fflag, iflag, pflag, rflag;
 int myumask;

 enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE };
@@ -129,10 +129,12 @@ main(argc, argv)
                        Rflag = 1;
                        break;
                case 'f':
+                       fflag = 1;
                        iflag = 0;
                        break;
                case 'i':
                        iflag = isatty(fileno(stdin));
+                       fflag = 0;
                        break;
                case 'p':
                        pflag = 1;

So the behaviour depends on the order of the arguments.  E.g. when doing:
        $ cp -if foo bar
no confirmation is asked, and:
        $ cat bar
        new
.

Here's a fix (tested):

--- src/bin/cp/cp.c.orig        Sun Nov  4 03:01:57 2007
+++ src/bin/cp/cp.c     Wed Jun 15 17:20:25 2011
@@ -113,8 +113,10 @@
                        iflag = 0;
                        break;
                case 'i':
-                       iflag = isatty(STDIN_FILENO);
-                       fflag = 0;
+                       if (!fflag) {
+                               iflag = isatty(STDIN_FILENO);
+                               fflag = 0;
+                       }
                        break;
                case 'p':
                        pflag = 1;




--
Gemaakt met Opera's revolutionaire e-mailprogramma: http://www.opera.com/mail/
(Remove the obvious prefix to reply.)

Reply via email to