LinuxForum.Fans
Тема

Случайная строка в sh

Автор: sudoer 9 сообщений 3136 просмотров
#71680

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

text

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

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

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

Выполнение строки: eval
Задержка на 5 минут: sleep 5m
Про $RANDOM уже написали. Добавлю, что в bash есть и арифметика -
[console]let X="2+2*2"
echo $X
6
[/console]
остальное - сами. если не получается man bash, или здесь спросите. сегодня писать скрипты за других я не в настроении ;)

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

#71836

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

text
while true
do
...
...
done

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

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

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

#71848
drBatty написал:
[quote=sudoer]почему-то не работает. Может, объясните в чем проблема?

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

вот:

text
#!/bin/sh

while true do echo "test" done

#71872

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

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

text
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 &

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

text
#!/bin/sh

while true do echo "test" done

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

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

#72100

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

Войдите или зарегистрируйтесь, чтобы ответить.