bash - странное поведение или я чего-то не понимаю

Автор m90125, 27 октября 2015, 20:22:44

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

m90125

Всем привет!

Проблема в следующем: некоторое время назад написал скрипт для запуска оффтопика в VirtualBox с последующим раскрытием окна на весь экран. Вот он (работает):

VBoxManage startvm WinXP --type gui && sleep 30 && xdotool search --name WinXP | xdotool windowactivate && xdotool mousemove 698 313 ; xdotool click --repeat=1 1 && xdotool key "Control_R+f"

Сегодня решил сделать подобный скрипт для LxTask (Диспетчер задач среды LXDE). Изменил предыдущий скрипт, поменяв название окна, время ожидания после запуска программы, координаты перемещения курсора мыши и комбинацию клавиш для раскрытия активного окна на весь экран:

lxtask && sleep 5 && xdotool search --name "Диспетчер задач" | xdotool windowactivate && xdotool mousemove 310 179 ; xdotool click --repeat=1 1 && xdotool key alt+F10

Этот скрипт не работает.

Вопрос - почему? Может кто-нибудь знает в чём тут дело?

Пробовал в консоли: xdotool search --name "Диспетчер задач" | xdotool windowactivate
Ответ:
There are no windows in the stack
Invalid window '%1'
Usage: windowactivate [options] [window=%1]
--sync    - only exit once the window is active (is visible + active)
If no window is given, %1 is used. See WINDOW STACK in xdotool(1)

Читал man xdotool на предмет WINDOW STACK, но мой английский плох и честно говоря ничего полезного для решения проблемы не понял. Нашёл это: http://www.linux.org/threads/xdotool-%E2%80%93-window-stack.6625/   , по прочтении попробовал много разных вариантов, все уже не вспомню, но никак.

Система Debian 8.2.0, IceWM (Последняя команда неработающего скрипта - нажатие alt+F10 для раскрытия активного окна на весь экран в IceWM. Сочетание само по себе работает.)


vic5710

Цитата: m90125 от 27 октября 2015, 20:22:44lxtask && sleep 5 && xdotool search --name "Диспетчер задач" | xdotool windowactivate && xdotool mousemove 310 179 ; xdotool click --repeat=1 1 && xdotool key alt+F10

все верно. пока lxtask не завершится, sleep не запустится.
примерно так:

lxtask &
sleep 5 && xdоtool #  и далее...


m90125

#2
Цитата: vic5710 от 27 октября 2015, 21:03:19lxtask &
sleep 5 && xdоtool
Да, всё заработало! Спасибо! :)
Кстати, sleep 1 достаточно. Символ ; в данном случае почему-то не работает, а & работает. Хотя это одно и то же: https://www.opennet.ru/docs/RUS/linux_base/node27.html

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

vic5710

Цитата: m90125 от 27 октября 2015, 21:13:19Символ ; в данном случае почему-то не работает, а & работает. Хотя это одно и то же:
тут вы ошибаетесь
; - последовательное выполнение команд
&& и || -  выполнение команд по коду возврата

MacBook-Air-Vic:temp vic57$ touch 1
MacBook-Air-Vic:temp vic57$ [ -f 1 ] && echo OK || echo ERROR
OK
MacBook-Air-Vic:temp vic57$ rm 1
MacBook-Air-Vic:temp vic57$ [ -f 1 ] && echo OK || echo ERROR
ERROR

m90125

Цитата: vic5710 от 27 октября 2015, 21:38:10тут вы ошибаетесь
; - последовательное выполнение команд
&& и || -  выполнение команд по коду возврата

Да, Вы конечно правы, но я имел ввиду знак ОДНОГО амперсанда, который, если верить приведённой мною ссылке, есть то же самое, что и ; . Или я что-то не так понял?

vic5710

#5
lxtask & - запуск процесса в фоне. &&  и || - это совсем другое
http://www.opennet.ru/docs/RUS/bash_scripting_guide/c12330.html

m90125