Редактирование строк в оригинальном ksh довольно ограничено. Вместо этого вы можете использовать один из его «клонов», например zsh¹ или bash.
Для ksh93 я обнаружил, что если вы используете vi
режим редактирования (ksh -o vi
), а не emacs
или gmacs
, то вызов многострочных команд работает , хотя перевод строки символы отображаются как ^J
. Это также то, что вы получаете с pdksh
и его производными во всех режимах редактирования.
Обратите внимание, что вы также можете ввести эти символы новой строки с помощью Ctrl+VCtrl+J , чтобы этот многострочный код -вводился в одной строке, а затем вы могли вызвать его позже. даже в режиме emacs
.
Другой вариант — использовать fc
для редактирования предыдущей строки в реальном текстовом редакторе:
fc while
Позвонит предпочитаемому вами редактору (в $FCEDIT
,по умолчанию ex
в моей системе )в последней (возможно многострочной )командной строке, которая содержала while
. А затем запустить его после сохранения и выхода в редакторе.
¹ zsh
также имеет режим эмуляции ksh
, который делает его поведение более близким к ksh
в случае, если есть некоторые ksh
варианты поведения, на которые вы полагаетесь (, введенные с помощью emulate ksh
или при вызове zsh
какksh
)
Во-первых, вам не нужно grep
выводls
:этого должно хватить
send "ls -1t $dbname.*\r"
И взять только самую новую:
send "ls -1t $dbname.* | head -1\r"
Теперь к сути вашего вопроса :да, может возникнуть проблема с извлечением вывода команды из ожидаемого _выходного буфера. Сделай это:
expect -re {(.*)\r\n$ $}
set cmd_output $expect_out(1,string)
cmd_output
будет содержать отправленную вами команду оболочки, а также вывод, все строки разделены \r\n
. Вы можете проверить его с помощью
exec od -c <<$expect_out(buffer)
Вам нужно удалить первую \r\n
разделительную строку. Вот один из способов сделать это:
if {![regexp {^.+?\r\n(.*)$} $cmd_output -> filename]} {
error "unexpected output: does not contain \\r\\n"
}
# now, go get $filename