0

I use autoexpect generated a script.exp. see following.

how to understand

expect -exact " \r Type ha for help on aliases\r \r ]0;luoric@linux-pc-64:/home/luoric/tmp[01;34mluoric@linux-pc-64[01;34m tmp \$[00m " ?

and after I run script.exp. I got "ls" and "ls -l" result correctly. and get command line prompt. but when I hit enter. there is no command line prompt. I have to use ctrl C, to exit so I can continue enter command from terminal.

What I'm missing?

#!/usr/bin/expect -f
#
# This Expect script was generated by autoexpect on Tue Dec 18 09:42:08 2018
# Expect and autoexpect were both written by Don Libes, NIST.
#
# Note that autoexpect does not guarantee a working script.  It
# necessarily has to guess about certain things.  Two reasons a script
# might fail are:
#
# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet,
# etc.) and devices discard or ignore keystrokes that arrive "too
# quickly" after prompts.  If you find your new script hanging up at
# one spot, try adding a short sleep just before the previous send.
# Setting "force_conservative" to 1 (see below) makes Expect do this
# automatically - pausing briefly before sending each character.  This
# pacifies every program I know of.  The -c flag makes the script do
# this in the first place.  The -C flag allows you to define a
# character to toggle this mode off and on.

set force_conservative 0  ;# set to 1 to force conservative mode even if
              ;# script wasn't run conservatively originally
if {$force_conservative} {
    set send_slow {1 .1}
    proc send {ignore arg} {
        sleep .1
        exp_send -s -- $arg
    }
}

#
# 2) differing output - Some programs produce different output each time
# they run.  The "date" command is an obvious example.  Another is
# ftp, if it produces throughput statistics at the end of a file
# transfer.  If this causes a problem, delete these patterns or replace
# them with wildcards.  An alternative is to use the -p flag (for
# "prompt") which makes Expect only look for the last line of output
# (i.e., the prompt).  The -P flag allows you to define a character to
# toggle this mode off and on.
#
# Read the man page for more info.
#
# -Don


set timeout -1
spawn $env(SHELL)
match_max 100000
expect -exact " \r
Type ha for help on aliases\r
 \r
\]0;luoric@linux-pc-64:/home/luoric/tmp\[01;34mluoric@linux-pc-64\[01;34m tmp \$\[00m "
send -- "ls\r"
expect -exact "ls\r
\[0m\[00;32manswerbot\[0m  \[00;32mexecmds.sh\[0m  \[00;32mexecmds.sh.exp\[0m  \[00;32mgdb.sh\[0m  \[00min\[0m  \[00mnohup.out\[0m  \[00;32mquestions\[0m  \[00;32mscript.exp\[0m  \[00mspawn\[0m  \[00;32mstb.sh\[0m  \[00;32mtarget.exp\[0m  \[00;32mtarget.sh\[0m  \[00;32mtel\[0m  \[00mtel.log\[0m  \[00;32mterm\[0m\r
\]0;luoric@linux-pc-64:/home/luoric/tmp\[01;34mluoric@linux-pc-64\[01;34m tmp \$\[00m "
send -- "ls -l\r"
expect -exact "ls -l\r
total 56\r
-rwxrwxr-x 1 luoric ccuser  256 Dec 10 14:26 \[0m\[00;32manswerbot\[0m\r
-rwxrwxr-x 1 luoric ccuser  264 Dec 13 17:07 \[00;32mexecmds.sh\[0m\r
-rwxrwxr-x 1 luoric ccuser  424 Dec 13 17:13 \[00;32mexecmds.sh.exp\[0m\r
-rwxrwxr-x 1 luoric ccuser  118 Dec 17 13:44 \[00;32mgdb.sh\[0m\r
-rw-rw-r-- 1 luoric ccuser    8 Dec 10 12:13 \[00min\[0m\r
-rw------- 1 luoric ccuser 6920 Dec 14 15:35 \[00mnohup.out\[0m\r
-rwxrwxr-x 1 luoric ccuser  160 Dec 10 14:30 \[00;32mquestions\[0m\r
-rwxrwxr-x 1 luoric ccuser    0 Dec 18 09:42 \[00;32mscript.exp\[0m\r
-rw-rw-r-- 1 luoric ccuser    0 Dec 13 12:56 \[00mspawn\[0m\r
-rwxrwxr-x 1 luoric ccuser  103 Dec 10 14:41 \[00;32mstb.sh\[0m\r
-rwxrwxr-x 1 luoric ccuser  463 Dec 17 14:57 \[00;32mtarget.exp\[0m\r
-rwxrwxr-x 1 luoric ccuser  140 Dec 17 13:50 \[00;32mtarget.sh\[0m\r
-rwxrwxr-x 1 luoric ccuser  864 Dec 17 11:46 \[00;32mtel\[0m\r
-rw-rw-r-- 1 luoric ccuser 1201 Dec 11 14:03 \[00mtel.log\[0m\r
-rwxrwxr-x 1 luoric ccuser  153 Dec 13 13:13 \[00;32mterm\[0m\r
\]0;luoric@linux-pc-64:/home/luoric/tmp\[01;34mluoric@linux-pc-64\[01;34m tmp \$\[00m "
send -- "exit\r"
expect eof
  • Don't use autoexpect unless you know exactly what you're doing. – Emily E. Dec 19 '18 at 3:17
  • Autoexpect records exactly what you typed, and exactly what you saw. You saw colourized text thanks to your shell profile's ls alias, and autoexpect dutifully wrote the terminal colour codes into the file. When I use autoexpect, I always immediately edit the resulting script and remove probably 95% of the contents -- you generally just want to determine what the prompts are so you can use them as the expect patterns. – glenn jackman Dec 21 '18 at 22:08
1

As a (formatted) followup to my comment, this is the actual take-away from that autoexpect script:

#!/usr/bin/expect
set prompt "\$\[00m $"
spawn bash
expect -re $prompt
send -- "ls\r"
expect -re $prompt
send -- "ls -l\r"
send -- "exit\r"
expect eof

That's what I mean about removing 95%.


To actually answer your question, if you want to interact with the spawned shell, change

expect eof

to

interact

That stops the scripted interaction and puts the user in command.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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