bug#60989: [PATCH] rm: fail on duplicate input if force not enabled

2023-01-22 Thread Pádraig Brady

On 22/01/2023 18:18, Philip Rowlands wrote:

On Sat, 21 Jan 2023, at 13:05, Łukasz Sroka wrote:

When the input files contain duplicates, then the rm fails. Because
 duplicates occur most often when the * is used and the shell unwraps it.
 There is a very common scenario when a user accidentally enters space
 after a filename, or enters space instead of forward slash.


To fail on duplicate FILE args, this bash function would do (lightly tested, 
doesn't attempt getopt processing):

function safe_rm {
   local -A seen
   local file
   for file in "$@"; do
 if [[ -v ${seen[$file]} ]]; then
   echo "error: duplicate name '$file'" 1>&2
   return 1
 fi
 seen[$file]=1
   done

   # no dupes seen
   command rm "$@"
}

and could be used today, without waiting for the next coreutils release.


That's informative, thanks.



As an aside, I could be reading it wrong but the coreutils manual suggests the 
file arguments are optional
rm [option]… [file]…


Right with the -f option rm will not fail if no arguments are specified
(in the presence of nullglob etc.), which is POSIX compliant.

cheers,
Pádraig





bug#60989: [PATCH] rm: fail on duplicate input if force not enabled

2023-01-22 Thread Philip Rowlands
On Sat, 21 Jan 2023, at 13:05, Łukasz Sroka wrote:
> When the input files contain duplicates, then the rm fails. Because
> duplicates occur most often when the * is used and the shell unwraps it.
> There is a very common scenario when a user accidentally enters space
> after a filename, or enters space instead of forward slash.

To fail on duplicate FILE args, this bash function would do (lightly tested, 
doesn't attempt getopt processing):

function safe_rm {
  local -A seen
  local file
  for file in "$@"; do
if [[ -v ${seen[$file]} ]]; then
  echo "error: duplicate name '$file'" 1>&2
  return 1
fi
seen[$file]=1
  done

  # no dupes seen
  command rm "$@"
}

and could be used today, without waiting for the next coreutils release.

As an aside, I could be reading it wrong but the coreutils manual suggests the 
file arguments are optional
   rm [option]… [file]…


Cheers,
Phil