[PATCH] Silence "cp: cannot stat '/etc/cmdline'..." error message

Will Woods wwoods at redhat.com
Thu Feb 28 18:45:29 UTC 2013


On Thu, 2013-02-28 at 10:35 -0800, Brian C. Lane wrote:
> On Thu, Feb 28, 2013 at 11:44:46AM -0500, Will Woods wrote:
> > These files may or may not exist; check to see if they exist before
> > copying them!
> > ---
> >  dracut/anaconda-copy-cmdline.sh | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> > 
> > diff --git a/dracut/anaconda-copy-cmdline.sh b/dracut/anaconda-copy-cmdline.sh
> > index 26aa340..2731d6c 100755
> > --- a/dracut/anaconda-copy-cmdline.sh
> > +++ b/dracut/anaconda-copy-cmdline.sh
> > @@ -1,5 +1,7 @@
> >  #!/bin/sh
> >  # Copy over cmdline(.d) files from the initrd to /run before pivot
> >  mkdir -p /run/install/cmdline.d
> > -cp /etc/cmdline.d/* /run/install/cmdline.d/
> > -cp /etc/cmdline /run/install/
> > +for f in /etc/cmdline.d/*; do
> > +    [ -e $f ] && cp $f /run/install/cmdline.d/
> 
> You don't really need that -e there since it's iterating over what's in
> the directory.

Actually, you do!

If the directory is empty or not present, bash will expand
"/etc/cmdline.d/*" to "/etc/cmdline.d/*". Attempting to copy that file
will result in the error message we're trying to avoid, because it
doesn't exist.

So this is a common shell idiom to avoid that error message:

    for f in /some/path/glob*; do
        [ -e $f ] || break # nothing matched the glob
        ...                # otherwise, do stuff with the files
    done

The code above is just a variation on that.

-w (who knows way more about shell than he would like)



More information about the anaconda-patches mailing list