Ожидаемый сценарий для загрузки новейшего файла с удаленного сервера с помощью grep

Редактирование строк в оригинальном 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)

0
15.01.2020, 13:31
1 ответ

Во-первых, вам не нужно 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
1
28.01.2020, 02:38

Теги

Похожие вопросы