Запустите несколько команд xdotool в одной строке, отделенных друг от друга

11

Я пытаюсь запустить xdotool type wordзатем xdotool key Returnиз настроек запуска приложений.
Но если я использую &&или ;, xdotool оценивает его как продолжение ввода.

Janot
источник
1
В моем сценарии использования он работает xdotool type $'word\r', где $''экранирует что- \rто вроде возврата ( \nздесь не работает).
Scz

Ответы:

16

Короче говоря:
используйте сценарий.

#! /bin/sh
# With some window selection magic, or a sleep 
# if you want to do that manually.
xdotool type word
xdotool key Return

И поместите путь сценария в Execполе.


Длинная история:

Согласно xdotoolсправочной странице :

type
       Supports newlines and tabs (ASCII newline and tab). 
       With respect to "COMMAND CHAINING", this command consumes the
       remainder of the arguments and types them. That is, no commands can
       chain after 'type'.

Цепочка команд с помощью ;или &невозможна, так как это синтаксис оболочки и Startup Applications не поддерживает синтаксис оболочки. Однако, если все, что вы хотите сделать, это нажать Enterпосле ввода чего-либо, есть обходной способ сделать это.

Когда он говорит «ASCII», новая строка не означает «голый» \n. И подстановка команд ( xdotool type "$(printf '\n')"скажем) съедает завершающие символы новой строки. После этого xdotoolsсообщения на форуме я попробовал это:

xdotool type "$(printf 'date\n ')"

И это сработало. Но это работает только в том случае, если после символа есть какой-то символ \n, и это, очевидно, оставляет завершающий пробел, который не будет тем, что вы хотите. Я изменил это, чтобы:

xdotool type "$(printf 'date\n\e ')"

И это работает и не оставляет места в конце. Однако это может вызвать проблемы у тех, кто использует режим Vi в своей оболочке.

Благодаря комментариям @ steeldriver я понял, что это из-за того, что я попробовал это на самом терминале, на котором выполнял команды. Достаточно небольшого промежутка между нажатием клавиши Enterи xdotoolкомандой, чтобы единственная новая строка была правильно зарегистрирована. Таким образом:

sleep 0.1; xdotool type $'date\n'

Так что либо расширив строку, указав ее

xdotool type 'date
'

или использование интерпретации оболочки, как предложено @steeldriver, выглядит как правильный вариант.

Тем не менее, скрипт, содержащий:

#! /bin/sh
sleep 1
xdotool type date
xdotool key Return

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

У вас может быть сценарий /usr/bin/xdotoolв шебанге, но на странице руководства написано « scriptрежим не полностью продуман и может оказаться ниже ваших ожиданий», поэтому я остановился на сценариях bash.

Возможно , я видел вещи, но в моих первых парах попыток, я должен был поставить (маленькие) sleepмежду typeи keyкомандами . Это был артефакт его тестирования на терминале, который выполнял команды, а не в другом окне.

Мур
источник
Буквальный перевод строка , кажется, работает т.е. с xdotool type 'wordпоследующим нажатием клавиши «Enter» , а затем закрытием ', как это делает $'word\n'(в котором Баш расширяет \nбуквальный перевод строки перед передачей аргумента xdotool).
Steeldriver
@steeldriver хит и мисс. Это было одно из первых, что я попробовал и не сработало.
Муру
@steeldriver То, что сработало, это две новые строки (два входа до закрытия 'или две \nс $трюк).
Муру
это странно, мне не нужна дополнительная новая строка - интересно, зависит ли это от приложения, которому принадлежит целевое окно (я использовал пустой документ в geany)?
SteelDriver
@steeldriver спасибо за совет. Рад, что у меня не было галлюцинаций о необходимости sleep(см. Примечание в небольшом тексте). Я не менял окна и просто пробовал его в одном и том же окне, но с помощью sleep 1обоих методов работал как в одном окне, так и после переключения. Я предполагаю, что мое собственное нажатие клавиши Enter как-то помешало переводу строки xdotool. Тем не менее, для более сложных требований к файлу рабочего стола, я все равно рекомендую скрипт.
Муру
1

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

bash -c 'xdotool type date; xdotool key Return'

Теперь вы также можете делать другие вещи оболочки ...

bash -c 'xdotool type "`date +"%Y-%m-%d_%T`"'

Обратите внимание, что команда «date», использованная в последнем, включает перевод строки! и "xdotool" выведет его.

ПРИМЕЧАНИЕ: если вы делаете это как макрос клавиатуры, я бы добавил еще несколько опций в «xdotool», чтобы сделать это лучше ...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
Энтони
источник