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.)