Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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.

share|improve this question
    
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 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 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 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 at 5:06
    
This is much, much harder to do with bash than it is with a real program. –  HalosGhost Jun 23 at 5:07

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.

#!/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... :)

share|improve this answer
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 at 9:13

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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