Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I'm trying to run xdotool type word then xdotool key Return from Startup Aplications Preferences.
But if I use && or ;, xdotool evaluates it as continuation of input.

share|improve this question

2 Answers 2

up vote 4 down vote accepted

Long story short:
Use a script.

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

And put the path of the script in the Exec field.


Long story:

According to the xdotool manpage:

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'.

Command chaining via ; or & isn't possible. However, if all you wish to do is press enter after typing something, there's a roundabout way to do so.

Even though it says "ASCII" newline, it doesn't mean \n. And my xdotool had a nasty habit of eating trailing newlines. Following this xdotools forum post, I tried this:

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

And it worked. But it only works if there is some character after the \n, and this obviously leaves a trailing space, which would not be what you want. I modified that to:

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

And this works and leaves no trailing space. However, all this was in a terminal, with me typing the commands directly. This didn't work in a script. Worse, it is very difficult to get it working in a .desktop file, with the difficulties in escaping.

Thanks to @steeldriver's comments I figured out that this was due to me trying it out on the very terminal I was executing the commands on. Just a small gap between my pressing Enter and the xdotool command was enough for a single newline to be registered correctly. Thus:

sleep 0.1; xdotool type $'date\n'

But this didn't help the behaviour with the printf command. In fact, the behaviour with printf just got worse whether I tried with the same window or a different one. So either extending the line by quoting it:

xdotool type 'date
'

or using the shell interpretation as @steeldriver suggested looks like the right option.

However, a script containing:

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

in the Exec field worked fine. Indeed, I always recommend using a script for complex commands in a desktop file.

You can have a script with /usr/bin/xdotool in the shebang, but the manpage says "script mode isn't fully fleshed out and may fall below your expectations", so I stuck to bash scripts.

I might have been seeing things, but in my first couple of tries, I had to put a (small) sleep between the type and key commands. That was an artifact of trying it out on the terminal that was executing the commands instead of another window.

share|improve this answer
    
A literal newline seems to work i.e. xdotool type 'word followed by the 'Enter' key and then the closing ', as does $'word\n' (in which bash expands the \n to a literal newline before passing the argument to xdotool). –  steeldriver Aug 23 at 20:49
    
@steeldriver hit-and-miss. That was one of the first things I tried and didn't work. –  muru Aug 23 at 20:50
    
@steeldriver What did work was two newlines (two Enters before closing the ' or two \ns with the $ trick). –  muru Aug 23 at 20:57
    
that's odd, the extra newline doesn't seem to be necessary for me - I wonder if it depends on the application that owns the target window (I was using an empty document in geany)? –  steeldriver Aug 23 at 21:01
    
@steeldriver thanks for tip. Glad to know I wasn't hallucinating about need for sleep (see the note in small text). I wasn't changing windows and just trying it out on the same window, but with a sleep 1, both methods worked with both the same window and after switching. I guess my own Enter keypress somehow interfered with the xdotool newline. However, for the more complex requirement of a desktop file, I'd still recommend the script. –  muru Aug 23 at 21:08

Seems to me the application is not parsing multiple commands, abut treating it as a single command. As such make it a single command by wrapping it a shell call...

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

Now you can also do other shell things...

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

Note that the "date" command used in that last includes a newline! and "xdotool" will output it.

NOTE: if you are doing this as a keyboard macro I would also add a few more options to "xdotool" to make this work better...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.