[Pkg-zsh-devel] Bug#969305: Bug#969305: zsh: safe-rm needs to be added to the default path of interactive shells to work

Francois Marier francois at debian.org
Mon Aug 31 20:04:47 BST 2020


On 2020-08-31 at 04:41:56, Daniel Shahaf wrote:
> I guess it should be in the zprofile file, guarded by a [[ -o interactive ]] check.

>From the comment in /etc/zsh/zshrc:

  # This file is sourced only for interactive shells. It
  # should contain commands to set up aliases, functions,
  # options, key bindings, etc.

I thought it was a better fit, given that /etc/zsh/zprofile claims it's only
for login shells:

  # This file is sourced only for login shells (i.e. shells
  # invoked with "-" as the first character of argv[0], and
  # shells invoked with the -l flag.)

Or maybe I got that wrong?

> > However, I don't see a way for packages to do this. So I guess there would
> > be two ways to make this possible:
> > 
> > 1. The main /etc/zsh/zshrc script could source all .sh files in a new
> >    /etc/zsh/zshrc.d/ directory.
> > 2. The /etc/zsh/zshrc that ships in Debian could include the above.
> > 
> > Are either of these something you'd be willing to consider?
> 
> I don't have an opinion one way or the other.
> 
> I do note that optionĀ #2 would cause a stat(2) call during shell startup
> for everyone who _doesn't_ use safe-rm.  Would that be a problem?
> (E.g., slower shell startup)

Good point about the extra stat. I honestly don't know whether that kind of
impact can even be reliably measured, but you're right that it would be
unnecessary for non-users of safe-rm.

> Probably not what you had in mind, but my first instinct here is to look
> for a shell-independent solution.  For example:

Indeed, that's an excellent approach and is in fact where I started.

> 3. Get the OS to add /usr/share/safe-rm/bin to $PATH before the user's
> shell is executed in the first place.  (On FreeBSD that'd be
> login.conf(5), but I don't know what the Linux equivalent is.)

That appears to be in /etc/login.defs, but without any way for a package to
configure.

There was a nice way to do that in the past given that /usr/bin was in front
of /bin in the path, but that became impossible once /usr/bin and /bin got
merged:

  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=759410

> 4. Use dpkg-divert(8) to replace /bin/rm with a wrapper that calls
> either safe-rm or the diverted rm binary, depending on whether it's
> interactive or not.

That was my first attempt and it turned out to be extremely risky and hard
to get right:

  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=489690

> If you don't already know them, see RM_STAR_SILENT and RM_STAR_WAIT in
> zshoptions(1).

Oh, that's very cool! A very good complement to safe-rm in fact since
that's not something safe-rm can do anything about since the shell expands
these globs before passing the paths to the rm command.

> P.S.  Compare #489646, about providing a directory for packages to drop
> completion files into.  (That didn't involve reimplementing
> run-parts(1), though; it was just a matter of adding a directory to
> a list of directories.)

Yes, having a /usr/share/zsh/vendor-config/ or similar would be very good.
It certainly doesn't have to live in /etc/.

Francois

-- 
https://fmarier.org/



More information about the Pkg-zsh-devel mailing list