在Bash脚本中使用expect
Your Bash script is passing the Expect commands on the standard input of expect
. That is what the here-document <<EOD
does. However, expect
... expects its commands to be provided in a file, or as the argument of a -c
, per the man page. Three options are below. Caveat emptor; none have been tested.
-
Process substitution with here-document:
expect <(cat <<'EOD' spawn ... (your script here) EOD )
The
EOD
ends the here-document, and then the whole thing is wrapped in a<( )
process substitution block. The result is thatexpect
will see a temporary filename including the contents of your here-document.As @Aserre noted, the quotes in
<<'EOD'
mean that everything in your here-document will be treated literally. Leave them off to expand Bash variables and the like inside the script, if that's what you want. -
Edit Variable+here-document:
IFS= read -r -d '' expect_commands <<'EOD' spawn ... (your script here) interact EOD expect -c "${expect_commands// /;}"
Yes, that is a real newline after
//
- it's not obvious to me how to escape it. That turns newlines into semicolons, which the man page says is required.Thanks to this answer for the
read
+heredoc combo. -
Shell variable
expect_commands=' spawn ... (your script here) interact' expect -c "${expect_commands// /;}"
Note that any
'
in the expect commands (e.g., afterid_rsa
) will need to be replaced with'\''
to leave the single-quote block, add a literal apostrophe, and then re-enter the single-quote block. The newline after//
is the same as in the previous option.