1

Итак, мы имеем файл list, состоящий из нескольких строк:

echo 123
cp -r /home/user/img /usr/img
rm / -rf
reboot
conky
startx

Например так. И имеем файл do.sh, при запуске которого через равные промежутки времени (5 минут, например) выбирается случайная строка из list, и подается на исполнение.
Собственно, вопрос. Каким должно быть содержание do.sh?
С sh не работал раньше, гугль уже гуглил.

2

Здесь посмотрите.

Был, был и весь вышел...

3

sudoer пишет:

И имеем файл do.sh, при запуске которого через равные промежутки времени (5 минут, например) выбирается случайная строка из list, и подается на исполнение.
Собственно, вопрос. Каким должно быть содержание do.sh?
С sh не работал раньше, гугль уже гуглил.

Выполнение строки: eval
Задержка на 5 минут: sleep 5m
Про $RANDOM уже написали. Добавлю, что в bash есть и арифметика -

 Консоль:
let X="2+2*2"
echo $X
6

остальное - сами. если не получается man bash, или здесь спросите. сегодня писать скрипты за других я не в настроении bx

PS: совсем забыл про свою любимую sed!
выбрать строку $X из файла:
sed -n "$X p" файл

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4

Спасибо всем, что помогли мне. Я почти все сделал. Но вот никак не могу прикрутить вечный цикл.
Конструкция

while true
do
...
...
done

почему-то не работает. Может, объясните в чем проблема?

5

sudoer пишет:

почему-то не работает. Может, объясните в чем проблема?

не знаю. у меня работает.
сейчас пример сделаю...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

6

drBatty пишет:
sudoer пишет:

почему-то не работает. Может, объясните в чем проблема?

не знаю. у меня работает.
сейчас пример сделаю...

вот:

#!/bin/sh

while true
do
        echo "test"
done
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7 (25.08.2010 21:08:20 отредактировано sudoer)

Не работает while все равно.
Содержимое rnd:

#!/bin/bash
while true
do
        let NUMA=`wc -l list`
        NUM=$NUMA+1
        let "X = $RANDOM % $NUM"
        exec `sed -n "$X p" list`
        sleep 1m
done

Содержимое list:

feh --bg-scale /home/user/wallpaper/pika.jpg &
feh --bg-scale /home/user/wallpaper/guroface.jpg &
feh --bg-scale /home/user/wallpaper/water.jpg &
feh --bg-scale /home/user/wallpaper/hiway.jpg &
feh --bg-scale /home/user/wallpaper/lovecube.jpg &
feh --bg-scale /home/user/wallpaper/kassete.png &
feh --bg-center /home/user/wallpaper/sarah.png &
feh --bg-scale /home/user/wallpaper/smile1.jpg &

Собсна, вот. Это работает:

#!/bin/sh

while true
do
        echo "test"
done

PS: без "&" тоже пробовал.

8

sudoer пишет:

Не работает while все равно.

тут не в while проблема:
откройте man bash, и нажмите / (это поиск), наберите \<exec\> (это поиск только слова целиком, execute не найдётся), увидите это:

exec [-cl] [-a name] [command [arguments]]
              If  command is specified, it replaces the shell.  No new process is created.  The arguments become
              the arguments to command.  If the -l option is supplied, the shell places a dash at the  beginning
              of the zeroth arg passed to command.  This is what login(1) does.  The -c option causes command to
              be executed with an empty environment.  If -a is supplied, the shell passes  name  as  the  zeroth
              argument  to  the executed command.  If command cannot be executed for some reason, a non-interac‐
              tive shell exits, unless the shell option execfail is enabled, in which case it  returns  failure.
              An interactive shell returns failure if the file cannot be executed.  If command is not specified,
              any redirections take effect in the current shell, and the return status is 0.  If there is a  re‐
              direction error, the return status is 1.

что значит, данная команда заменяет оболочку, а вовсе не выполняет строчку. т.е. выполняется первая команда, которая подменяет собой скрипт, и вы вываливаетесь обратно в командную строку. А я вам советовал eval...

кстати, ампресанд & внутри скриптов не работает, это интерактивная команда. помнится я долго мучился, в поисках решения, оно оказалось простым: достаточно запускать отдельный процесс, и уж он будет работать параллельно. об этом здесь (уж простите за PR, но повторю, нигде больше не было/не смог найти/непонашему и непонятно)

И ещё, let следует применять для вычислений, а просто присваивание - для присваивания. У вас наоборот:
        let NUMA=`wc -l list`
        NUM=$NUMA+1

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

Огромное спасибо за предоставленную помощь. Насчет eval и let учту на будущее. В первый раз сталкиваюсь с написанием скритпов. Все взлетело.