LINUX.ORG.RU

Bash

 ,


0

1

Есть скрипт:

#!/bin/sh
sleep 5s;
for i in `seq 1 50000`; do
    `xdotool click 1`
    sleep 2s;
    `xdotool key Alt+Tab`
    sleep 2s;
    `xdotool click 1`
    sleep 2s;
    `xdotool click 1`
    sleep 2s;
    `xdotool click 1`
#	`xdotool click 3`
#sleep 1s;
#	`xdotool key "4"`
#sleep 1s;
#	`xdotool key Tab`
#sleep 1s;
#	`xdotool key "w"`
#sleep 1;
#	`xdotool key Escape`
    sleep 2;
    `xdotool key Alt+Tab`
    sleep 2s;
done

Умирает он через killall имя_скрипта.sh

Однако при новом запуске он стартует не с начала, а с того места, где умер. Так и должно быть? Это вообще нормально для приличного скрипта?

★★★★★

Нет, это запрещено правилом 4.2.

Разбавь его отладочными echo и убедись, что это не так. Или просто первый sleep увеличь.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Но это так. Там у меня разбавочный альт+таб. Между табами 1 клик или 3 клика. После убийства стартует именно там, где убился. То есть иногда стартует с трех кликов, иногда с первого клика. Что то это ненормально.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Это не только клик мыши. Давай рассказывай полностью, что ты хотел изобразить этой строчкой

anonymous
()
Ответ на: комментарий от anonymous

Я хотел раскрыть всю боль моей души от несовершенства этого мира в плане несоответствия божественного и материального. Однако это просто клик первой кнопкой мыши. Она же левая. Но проблема именно в том, что новый старт скрипта начинается в строгой зависимости от того, где я его убил.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

попробуй выполнить безобидный на вид

`echo rm -rf важные каталоги`

Это же всего лишь вывод строки на экран, или нет?

anonymous
()
Ответ на: комментарий от anonymous

Переведи что тебе не нравится в клике левой кнопкой. Другой функции той команды я не знаю.

К слову, в очень редких случаях (один из 20-30 стартов) он запускается со второго таба, однако по какой то причине новый альт+таб не срабатывает (происходит легкое мельтешение на экране, будто альт+таб сработал дважды и далее скрипт работает как задуманно).

LightDiver ★★★★★
() автор топика

попробуй так

#!/bin/bash
sleep 5s;
for (( i=1; i <= 50000; i++ ))
do
    `xdotool click 1`
    sleep 2s;
    `xdotool key Alt+Tab`
    sleep 2s;
    `xdotool click 1`
    sleep 2s;
    `xdotool click 1`
    sleep 2s;
    `xdotool click 1`
#	`xdotool click 3`
#sleep 1s;
#	`xdotool key "4"`
#sleep 1s;
#	`xdotool key Tab`
#sleep 1s;
#	`xdotool key "w"`
#sleep 1;
#	`xdotool key Escape`
    sleep 2;
    `xdotool key Alt+Tab`
    sleep 2s;
done
exit
anonymous
()
Ответ на: комментарий от anonymous

В душе не представляю. Использую потому что нагуглил этот вариант использования и он работает.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Мне не нравится то, что Bash – говно, а ты взял эту как в рот и сходу запутался в 50 видах кавычек в этом дерьмоязычке.

Решение твоей проблемы.

  1. Взять нормальный язык программирования для скриптов, а не калякать неподдерживаемый говнокод на Bash’е. Пусть это будет Python.
  2. Взять батарейку, которая решает твою задачу, пусть это будет python-libxdo: https://github.com/rshk/python-libxdo
  3. Сесть и написать нормальный скрипт, который можно в будущем поддерживать и расширять, а не Bash-лапшу.
  4. Profit!
EXL ★★★★★
()
Ответ на: комментарий от EXL

Фу на тебя. Он же нагуглил и это работает. Только не работает…

lua
()
Ответ на: комментарий от lua

Это странный спор не по теме. В бытовом плане мне хватает баша и си. Профессионально я этим не занимаюсь, чтобы изучать новые языки только для простенького скрипта, учитывая что баш может использовать кучу уже готовых отличных решений, вроде того же хдутула.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вроде заработало как надо, спасибо. Еще потестирую. Интересно было бы узнать причину почему не работал мой вариант.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Апострофы `cmd` выполняют команду cmd и возвращают вывод этой комнады. А так как это не присвоение переменной, то этот вывод выполняется как комнада bash.

То есть `xdotool click 1` не только кликнет мышкой, но еще выполнит как комнаду bash, то что выведет xdotool на экран (точнее - в стандартый вывод).

Поэтому убери эти обратные кавычки для всех `xdotool ...`.

for i in `seq 1 50000`; do
    # без кавычек
    xdotool click 1
    sleep 2s;
    # без кавычек
    xdotool key Alt+Tab
    # и так далее

Использую потому что нагуглил

Теперь понятно откуда эти апострофы

anonymous
()
Ответ на: комментарий от LightDiver

Тебе выше уже писали - синтаксис твоего скрипта неправильный - лишние апострофы приводят к запуску дочерних процессов! Убери все апострофы! Команда sleep ничем не отличается от команды xdotool, однако в одном случае ты ставишь апострофы, в другом - нет.

sigurd ★★★★★
()
Ответ на: комментарий от anonymous

А вот фиг там. Сейчас на очередном тесте залипло на секунду и стартануло снова со второго таба. Всеравно работает криво.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

sleep 2s;

Bash не требует точки с запятой в конце команды (это не С). Ну и s подразумевается по умолчанию, так что достаточно sleep 2

sigurd ★★★★★
()
Ответ на: комментарий от lua

Нормальные советы я и пробую. Удалил апострофы, буду тестировать.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от sigurd
#!/bin/sh
sleep 5s
for (( i=1; i <= 50000; i++ ))
do
xdotool click 1
sleep 2
xdotool key Alt+Tab
sleep 2
xdotool click 1
sleep 2
xdotool click 1
sleep 2
xdotool click 1
sleep 2
xdotool key Alt+Tab
sleep 2
done
exit

Получилось как то так. Казалось бы, все должны быть довольны (кроме питонщиков), но на восьмой-девятый запуск оно опять начало со второй части. Начинаю подозревать тут косяк квина кедовского, а не скрипта.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Скрипт тоже можно улучьшить!
1. exit в конце файла ненужен
2. все команды xdotool заменить на один вызов (она тоже умеет sleep)


xdotool click 1 sleep 2 key Alt+Tab и т.д

sigurd ★★★★★
()
Ответ на: комментарий от LightDiver

опять начало со второй части

С xdotool key Alt+Tab?

«killall скрипт» убивает только выполнение скрипта, а конкретные комнады (отдельные программы, как xdotool) могуть остаться работать-висеть, и могут сработать неизвестно когда.

Также комнады для оконного менеджера могут зависнуть в очередях, особенно всякие Alt-Tab (какую нетривиальную задачу выполняет эта комбинация?)

anonymous
()
Ответ на: комментарий от sigurd
#!/bin/sh
sleep 5s
for (( i=1; i <= 50000; i++ ))
do
xdotool click 1 sleep 2 key Alt+Tab sleep 2 click 1 sleep 2 click 1 sleep 2 click 1 sleep 2 key Alt+Tab sleep 2
done

Угу, вроде заработало как надо и теперь скрипт не убивается, пока не завершит всю последовательность (что слегка даже бесит), зато 20 прогонов подряд сработал как задумывалось.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от anonymous

Можно прибить группу задач (process group) -g, да еще с -s KILL. Но думаю, это тоже не гарантия, что оконные сообщения не затрянут в очередях с непредсказуемым эффектом.

anonymous
()
Ответ на: комментарий от anonymous

Все уже, выше вон нащупал, вроде как окончательный рабочий вариант. Все пашет, правда теперь эта зараза не убивается, пока полностью не пройдет весь цикл. Но к этому можно привыкнуть.

Всем спасибо. Буду тестировать.

LightDiver ★★★★★
() автор топика

В начале скрипта вызови set -x (вывод каждой исполняемой команды) и посмотри что на самом деле у тебя там происходит.

И да, кавычки твои - это бред, ты подаёшь выход xdotool как команды скрипта. Хорошо, что он молчит.

legolegs ★★★★★
()
Ответ на: комментарий от LightDiver

Вместо альтабания можно узнать номера нужных окон и делать их активными. Или даже посылать сообщения в неактивные окна.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Как посылать в неактивные?! И как узнать номера? А можно ли назначить номера перманентно? А то мне это нужно раз по 30 в день и окна могут перезапускаться.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Ясно, 5-звездочный гуглер, копирующий комнады из интернета, не понимая что они делают. Читать документацию и маны к используемым инструментам не умеет.

anonymous
()
Ответ на: комментарий от anonymous

В обших пределах весьма понимать что делает. Чего хватает, чтобы пользоваться. Углубленное знание всех языков программирования мне не требуется. Вот ты знаешь как принять роды у коз?

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Спасибо. Надо только подумать как это использовать. Ибо именно нужные окна - единственные динамические и могут менять положение и размер.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Только через killall проходит до конца. ctrl+c прерывает его мгновенно.

Значит, ты не туда посылаешь килл. Посылай по pid.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

pid всегда меняется же. Мне его каждый раз выискивать (к слову как и новые номера окон вот ну вообще не получится, ибо извращение). И скрипт же в итоге убивается, значит все таки примерно туда куда нужно.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Ну, если будет очень скучно, я поищу инструменты. Возможности я примерно понял, большое спасибо.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Вот ты знаешь как принять роды у коз?

А коза знает, что без человека она не уродится? Придумал проблему, где его нет.

anonymous
()
Ответ на: комментарий от anonymous

Коза может и не знает, но в некоторых случаях просто помрет и ты останешься без козы. В дикой природе это пофиг, но тебе это печалька. Я могу небольшую лекцию провести часа на три про роды коз, свинок и даже гусей, а ты про программирование. Толку то.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Коза может и не знает, но в некоторых случаях просто помрет и ты останешься без козы.

Нахер не нужна такая коза, у которой проблемы с родами. Тем более в дикой природе. Не придумывай проблему.

Если что, я и свиней резал и телят, и цыплят, и маленьких мимишных котят (это для пущего эффекта). Вот там без человека (знающего) никак.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.