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.

  • 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


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.


# Where are the files?


# 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.

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

# For every file on the list...
  # 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"

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

  • 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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.