Background switcher

Giorgos Keramidas keramida at ceid.upatras.gr
Thu Mar 29 21:48:57 EEST 2007


On 2007-03-29 21:18, Θοδωρής Λύτρας <aspirin at myrealbox.com> wrote:
> Στις Πέμπτη 29 Μάρτιος 2007 20:25, ο/η Αθανάσιος Οικονόμου έγραψε:
> > > Μπορεί τώρα να μου πει κάποιος πως θα πω στο shell το παρακάτω (ακολουθεί
> > > ψευδοκώδικας):
> > > ΑΝ (ώρα>07:00 && ώρα<19:00)
> > >         {
> > >         dcop kdesktop KBackgroundIface setWallpaper 0 μέρα.jpg 1
> > >         }
> > > ΑΛΛΙΩΣ
> > >         {
> > >         dcop kdesktop KBackgroundIface setWallpaper 0 νύχτα.jpg 1
> > >         }
> >
> > Ελπίζω να βοηθήσει το παρακάτω ;-)
> >
> > #!/bin/bash
> >
> > $dt=`date +%H`
> >
> > if [ $dt -gt 7 -a $dt -lt 19 ]; then
> >  echo morning;
> > else
> >  echo night;
> > fi;
> 
> Ευχαριστώ πολύ. Αυτό που έγραψες πετάει λάθος:
> ./wallpr: line 3: =21: command not found
> ./wallpr: line 5: [: too many arguments

Όλα αυτά είναι αποτέλεσμα του αρχικού $dt=... assignment.

Το shell αντικαθιστά το `date +%H` με 21 και βλέπει κάτι σαν:

    =21

Φυσικά, δεν υπάρχει τέτοια εντολή και σου γράφει:

    ./wallpr: line 3: =21: command not found

Ύστερα πάει να εκτελέσει την εντολή:

    [ $dt -gt 7 -a $dt -lt 19 ]

Και αντικαθιστά το $dt με το τίποτα, αφού δεν έχει οριστεί μεταβλητή dt
σωστά.  Αυτό είναι ισοδύναμο με:

    [ -gt 7 -a -lt 19 ]

και εδώ είναι που σου γράφει το επόμενο syntax error:

    ./wallpr: line 5: [: too many arguments

> κατάλαβα τη λογική όμως, και ετούτο εδώ δεν πετάει λάθος:
> 
> #!/bin/bash
> if [ `date +%H` -gt 7 -a `date +%H` -lt 19 ]; then
>  echo morning;
> else
>  echo night;
> fi;

Δε χρειάζεται να τρέξεις δυο φορές την εντολή date :)

> Σας ευχαριστώ όλους! Το έφτιαξα ήδη αυτό με τα wallpaper, δουλεύει και
> είναι πολύ cool! (Δείχνει μια παραλία εδώ στη Σκόπελο, με τον ήλιο
> ψηλά τη μέρα και σκοτεινή το βράδυ).

Χαχα.  Φανταστικό :-)

Με λίγο ακόμα προσπάθεια, μπορείς να κάνεις και ένα background changer
που "παίζει random slide show" με βάση ένα κατάλογο, π.χ. με κάτι σαν
το παρακάτω εντελώς untested script :P

% #!/usr/bin/env bash
% #
% # bgslide.sh - switch KDE desktop backgrounds periodically
% #
% 
% usage()
% {
%         echo >&2 "usage: $(basename $0) FOLDER [ SECONDS ]"
% }
% 
% warn()
% {
%         echo >&2 "$(basename $0): WARNING: $*"
% }
% 
% err()
% {
%         errcode=$1
%         shift
%         echo >&2 "$(basename $0): ERROR: $*"
%         cleanup
%         exit $errcode
% }
% 
% tmpfile=''
% cleanup()
% {
%         if test -n "${tmpfile}" ; then
%                 /bin/rm -f "${tmpfile}"
%         fi
% }
% trap "cleanup; exit 0" 0
% trap "cleanup; exit 1" 1 2 15
% 
% pickrandomfile()
% {
%         folder="$1"
%         if test ! -d "${folder}/." ; then
%                 err 1 "${folder}: directory not found"
%         fi
% 
%         tmpfile=$(mktemp "${TMPDIR:-/var/tmp/bgslide-XXX}")
%         if test $/ -ne 0 ; then
%                 err 1 "temporary file creation failed"
%         fi
% 
%         ( cd "$folder" ; find . \! -type d ) > "${tmpfile}" 2>/dev/null
%         if test $? -ne 0 ; then
%                 err 1 "${folder}: cannot list directory contents"
%         fi
% 
%         lines=$(wc -l "${tmpfile}")
%         if test $? -ne 0 ; then
%                 err 1 "${tmpfile}: line count error"
%         fi
% 
%         x=$(expr $RANDOM % $lines 2>/dev/null)
%         if test $? -ne 0 ;then
%                 err 1 "expr: random line selection error"
%         fi
% 
%         sed -ne "$x"p "${tmpfile}"
%         if test $? -ne 0 ;then
%                 err 1 "${tmpfile}: random line selection error"
%         fi
% }
%
% setbackground()
% {
%         folder="$1"
%         if test ! -d "${folder}/." ; then
%                 err 1 "${folder}: directory not found"
%         fi
% 
%         selection=$(pickrandom "${folder}")
%         if test $? -ne 0 ;then
%                 err 1 "${folder}: random file selection error"
%         fi
% 
%         dcop kdesktop KBackgroundIface setWallpaper 0 \
%             "${folder}/${selection}" 1
%         if test $? -ne 0 ; then
%                 err 1 "dcop: failed to set background"
%         fi
% }
% 
% if test $# -ne 1 && test $# -ne 2 ; then
%         usage ; exit 1
% fi
% 
% folder="$1"
% sleepdefault="300"
% sleepseconds="$2"
% 
% if test -n "$sleepseconds" ; then
%         # Check that we have a numeric argument.
%         expr "$sleepseconds" + 0 >/dev/null 2>&1
%         if test $? -ne 0 ; then
%                 warn "${sleepseconds}: not a numeric value," \
%                      "using default = $sleepdefault"
%                 sleepseconds="$sleepdefault"
%         fi
% else
%         sleepseconds="$sleepdefault"
% fi
% 
% while true ; do
%         setbackground "${folder}"
%         sleep "$sleepseconds"
% done

PS: Ναι, το UNIX είναι απίθανο λειτουργικό :-)




More information about the Linux-greek-users mailing list