Intereting Posts
Как запустить Vagrant в качестве обычного пользователя в Fedora? Как я могу узнать, почему мой Юбики работает на компакт-диске Debian Jessie live, но не с FAI / debootstrap? Как правильно настроить анонимную NFS Возвращаемое разрешение в числовой форме файла / каталога Как установить Linux Mint на 24-Гбайт SSD вместе с жестким диском 1 ТБ Странное поведение на рабочем столе Gnome Найти шаблон между специальными символами Имеет ли значение изменение пакетов через Apper или Software Center в Debian? Где и как я могу получить и установить сертификаты на новую установку OpenSSL? Я переместил новую программу в папку bin, но ничего не происходит, когда я пытаюсь запустить ее Возможно ли переустановить Debian заново и сохранить всю разрез и данные из существующей установки? Оптимизация производительности Как загружать модули при запуске в определенном порядке? В чем разница между & 6 и / dev / fd / 6? Можно ли отключить многословную версию в середине работы?

ожидать – как выйти с кодом состояния 1, если команда не выполняется?

Моя цель состоит в том, чтобы переименовать файл на сервере sftp, используя функцию ожидаемого И, если переименовать не удалось, для выхода ожидаем, возвращая код состояния 1

Мой ожидаемый скрипт работает нормально – он успешно переименовывается.

Я не могу понять, как выйти с кодом состояния, если переименование не удается.

ubuntu@ip-10-0-0-138:~$> cat expect_script.txt spawn sftp -o "StrictHostKeyChecking no" ubuntu@nginx.localvpc expect "password:" send "somesupersecretpassword\n" expect "sftp>" send "rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4\n" expect "sftp>" send "rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4\n" expect "sftp>" send "bye\n" expect "#" exit 

Вот вывод, когда я запускаю свой скрипт:

 ubuntu@ip-10-0-0-138:~$> expect -f expect_script.txt spawn sftp -o StrictHostKeyChecking no ubuntu@nginx.localvpc ubuntu@nginx.localvpc's password: Connected to nginx.localvpc. sftp> rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4 rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4 sftp> rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4 rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4 sftp> bye bye ubuntu@ip-10-0-0-138:~$> 

Может кто-нибудь предложить, что я могу сделать, чтобы выйти с кодом возврата ноль, если переименование не удается?

Бонусный вопрос … как правильно выйти в конце моего ожидаемого сценария? Это один из них?

 exit close expect eof 

Спасибо!

    Вам необходимо проверить наличие ошибки переименования, сопоставив этот текст и действуя в соответствии с ним. Это можно абстрагировать в proc (то, что TCL называет подпрограммой или функцией).

     spawn ... set ret 0 expect "sftp>" proc sftp_rename {from to} { global ret send "rename $from $to\n" expect { -ex "Couldn't" { set ret 42; exp_continue } "sftp>" } } sftp_rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4 sftp_rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4 send "bye\n" expect eof exit $ret 

    Я хотел бы использовать expect eof как я ожидаю, что соединение expect eof в этот момент.

    Моя справочная страница для expect говорит:

    exit [-opts] [status]

    […] статус (или 0, если не указан) возвращается как состояние выхода Expect.

    Итак, вы просто хотите exit 1 .


    Что касается ваших трех вариантов, expect eof , expect eof будет ждать команды, с которой вы expect , чтобы достичь EOF. Вы можете продолжить expect сценарий после этого. expect eof полезен в случаях, когда это только один из вариантов, или когда пульт может обнаружить отключение и воспринимать это как ошибку. (Конечно, если обе стороны разговора ждут остановки другой, они застрянут.)

    close закроет соединение с другим процессом, поэтому в expect eof смысле действует как обратное expect eof . Опять же, ваш сценарий может продолжаться после этого. Использование close непосредственно перед выходом из скрипта мало что дает, так как exit также неявно close .

    Тогда есть exit который выходит из вашего сценария. Выбор между тремя зависит от того, что вы хотите сделать. Если вы хотите выйти, я бы сказал, просто exit , и пусть удаленная сделка с EOF.