NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Cooless with feh



What does "  sh -ec '  " mean?
I am assuming "/bin/sh -ec ' "

I rarely do shell -- usual perl

On Mon, Sep 14, 2026 at 12:36 PM Robert Elz <kre%munnari.oz.au@localhost> wrote:
>
>     Date:        Sun, 13 Sep 2026 17:49:57 -0600
>     From:        "DTB" <trinity@tebibyte.media>
>     Message-ID:  <DLELAOTJGZH1.3D0Z8QIIQ9UNX@tebibyte.media>
>
>   | # I have not tried this! You may have to debug.
>
> Yes.
>
>   | sh -ec '
>   | while :; do
>   |     pkill feh || true
>   |     feh --class wallpaper -g +0+$y /path/to/wallpaper.tif
>   |
>   |     y=$(echo $y 1 + p | dc) # +1 per round
>   |     test $y -gt 100 && y=0  # 0-100
>   |     sleep 5                 # 5s
>   | done'
>
> I know nothing about feh, or moving wallpapers (can't even imagine
> wanting that) or how smooth a technique like that would be, but as
> a sh script that's just painful to look at.
>
> Instead try:
>
> sh -c ' y=0
>         while :
>         do
>                 pkill feh 2>/dev/null
>                 feh --class wallpaper -g +0+"$y" /path/to/wallpaper.tif || exit
>                 y=$(( y + 1 > 100 ? 0 : y + 1 ))
>                 sleep 5 || exit
>         done'
>
> No evil -e, and because of that, no need for the || true after the pkill
> (but redirecting stderr, if there is no feh running, no need to be told
> about it), the next line might (probably does, but as I don't know feh
> I'm not sure)
>
>                 feh --class wallpaper -g +0+"$y" /path/to/wallpaper.tif &
>
> instead of what I put there - depends whether feh just loads the wallpaper
> and exits (in which case you want the first version with "|| true")
> or if it remains running, in which case you need the version with '&'
> instead, and in that case, between the pkill and the feh you also
> need to add "wait" (just that as command), or perhaps "wait $! || :"
> with the $! unquoted, so the first time it will just be "wait" which
> should do nothing, and later times it will wait for the previous "feh"
> to have exited before starting a new one - but starting async ('&' processes)
> and never waiting for them to exit isn't a good idea (it won't make
> zombie processes, the shell cleans up, but it is also remembering all
> the exit status values for no reason).
>
> The "sleep 5 || exit" as I expect that most of the time, that "sleep"
> will be what is running, and if interrupted or killed in some other way,
> you want the whole script to exit, not just iterate one more time.  That's
> the place where the -e might have automated that, but it really is better
> to decide when the script should exit because of an error, and code that
> explicitly, rather than hoping -e will work as desired (it often doesn't).
>
> And to answer the on-list question, 'y' would be the y coordinate of the
> image on the screen, the original script didn't initialise it, hence you
> probably would get an error from "-g +0+" as the opion to feh the first
> time, and the y=$(echo $y 1 + p | dc) wouldn't have worked either.
> This version will gradually move the top of the wallpaper down the
> screen.   To move up, init y to 100, and change the "y=" line in the
> loop to be:
>         y=$(( y - 1 < 0 ? 100 : y - 1 ))
>
> It is quite likely that "100" is wrong, in both versions, and needs to
> be the vertical size of your screen, but again, I don't know feh, nor
> how it interprets its args, that might be a percentage of the screen size,
> rather than a pixel count, for all I know.
>
> kre
>
> ps: the script as a whole (moving down) using async feh might be ...
>
> sh -c ' y=0
>         while :
>         do
>                 pkill feh 2>/dev/null
>                 wait $! || :
>                 feh --class wallpaper -g +0+"$y" /path/to/wallpaper.tif &
>                 y=$(( y + 1 > 100 ? 0 : y + 1 ))
>                 sleep 5 || exit
>         done'
>
>


Home | Main Index | Thread Index | Old Index