2

I am trying to use fbi in a bash script to display a series of .jpg images. But once fbi begins its process, it continues to cycle through the images and I only want to display each image once for a set period of time.

10
  • Please consider adding a link to the homepage of the tool you are using (or, some information about it, at least; e.g., the version).
    – HalosGhost
    Jun 20, 2014 at 5:27
  • I am try to display a series of .jpg imagaes running Linux on a RaspberryPi with a single line bash script.
    – Steve B
    Jun 23, 2014 at 4:59
  • It seems like this would be better suited for a program that can handle multiple files from the get-go. For example, I would recommend sxiv.
    – HalosGhost
    Jun 23, 2014 at 5:03
  • I am try to display a series of .jpg images running Raspian Gnu/Linux7 on a RaspberryPi with a single line bash script. The single command is "sudo fbi -noverbose -m 640x480 -t 1s /boot/images/0.*.jpg" and it continuously cycles through the set of images and can be stopped with a keyboard "esc" input, but I want to stop it after a set time interval.
    – Steve B
    Jun 23, 2014 at 5:06
  • 1
    This appears to be an example of the XY Problem. If you want to view the images like so, you could easily use a loop in a shell script and break after a given time lapse. However, it doesn't seem like this is your real issue, but rather a solution that you've come up with to work around the real issue even though it may not be the best option.
    – HalosGhost
    Jun 23, 2014 at 17:30

1 Answer 1

2

Disclaimer: I didn't actually test this with fbi, I used watch with a bunch of text files (watch displays text, not images, but it also runs until it's killed, like fbi), so in theory this (or similar) technique should also work with fbi.

#!/bin/sh

# Where are the files?
IMG_PATH="/foo/bar/fred/"

cd $IMG_PATH

# File list. Can either be hard-coded, space separated,
# or to use the output of a command, use $(command). The
# safest approach is to use a shell glob as I have done here.
FILE_LIST=*.txt

# How long to run the command in seconds before killing it?
TIMEOUT=1

# For every file on the list...
for FILE in $FILE_LIST
do
  # OK, this is where the magic happens...
  # First invoke a shell and feed the mini script (in double quotes)
  # to that shell. The mini script first executes fbi with whatever
  # filename is now set to $FILE by the loop, meanwhile, whatever is
  # in brackets gets executed simultaneously (sleep for $TIMEOUT seconds
  # then force kill the second shell and all its children, including fbi).
  # What the heck is \$\$? Well, $$ normally refers to the process ID
  # of the script itself. But we don't want to kill the main script with
  # the for loop - we want to loop to go on. So we escape the $$ with
  # backslashes like so \$\$ so that literally "$$" gets passed to the
  # second subshell, so it kills only itself (and fbi as its child).
  #########################
  # You can add parameters to fbi if you need to.
  # Also you may want to try removing the -9 parameter to kill in
  # case it messes up your framebuffer... not sure how well fbi
  # handles a forceful (-9) vs. graceful (no -9) kill.
  sh -c "(sleep $TIMEOUT; kill -9 \$\$) & exec fbi $FILE"
done

I hope that this at least points you in the right direction... :)

1
  • 1
    I changed your ff=$(ls *txt) to ff=*txt. Using ls that way breaks on even the simplest of strange names, try it on a filename that contains a space for example. As a general rule, you should always avoid using ls to generate a list of file names. ls is designed to be read by humans, not parsed. For more info see here and here.
    – terdon
    Jun 20, 2014 at 9:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .