For convenience, I'll define the prompt and command first: set command date ;# our remote command set prompt "% " ;# our shell or whatever prompt we have Now we can do useful things: expect $prompt ;# wait for prompt send $command\r ;# send command expect $command\r\n ;# discard command echo Finally, match and save the result and discard the next prompt: expect -re (.*)\r\n$prompt\r\n Now the result is in $expect_out(1,string). If you want to read more about this, start on page 113 of [BOOK Exploring Expect]. This idiom is difficult for some programmers. The point is that [Expect] never gives direct access to "the result of a (foreign) command"; it simply transacts [send]-expect dialogues, and the developer has to know how to subtract out prompts, newlines, and other conventional decorations. [PS]: If the result might be more than 2000 characters, you'll need to use the [match_max] command to increase the buffer space. ---- [Ken Jones]: I corrected the second '''expect''' command in the example above. It originally read: expect $prompt\r\n ;# discard command echo but as the comment indicated, the intent was really to discard the command echo, which is achieved by: expect $command\r\n ;# discard command echo ---- ---- "[Remote input-output with Expect]" gives a model for line-oriented result access. ---- The example above didn't work for me (yes, I know that the above is not a complete programme). The following is an example which works on my [FreeBSD] 4.7 machine. set prompt ">>> " ;# our shell or whatever prompt we have set command "date" ;# the command whose output we want to catch spawn bash ;# spawn the bash expect "$prompt" ;# wait for prompt send "$command\r" ;# send command expect "$command\r" ;# discard command echo expect -re "(.*)\r" ;# match and save the result ---- The above is really an attempt to access local command output, not remote, and it will only get one line of the output (up to the first line termination). Use exp_continue to maintain the expect loop. If you are spawning a single shell command on your own host, just spawn the command - this allows an expect 'eof' branch to trigger when the command output is complete. This also avoids match_max hassles (assuming you are matching on non-binary output.) spawn $command set lineterminationChar "\r" expect { $lineterminationChar { append output $expect_out(buffer);exp_continue} eof { append output $expect_out(buffer)} } puts $output ;#RJ ''Tip for determining your host's line terminator - put "exp_internal 1" before the "expect" command.'' ---- Get in the habit of using [exp_send] instead of [send] when using Expect. If you later decide to add [Tk] to your [script] you will not collide with Tk's [send] command. ---- "[How Expect can capture the exit code from a remote command]" "[Remote input-output with Expect]" ---- [Category Expect]