Передача stdin в сценарий «ожидаю» - PullRequest
1 голос
/ 24 июня 2011

Я загружаю файл через ftp, используя expect.Файл передается в мой скрипт bash.

#!/bin/bash
HOST='example.com'
USER='XXX'
PASSWD='XXX'

expect << EOT
spawn ftp $HOST
expect "Name*:"
send "$USER\r"
expect "Password:"
send "$PASSWD\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "prompt\r"
expect "ftp>"
send "put - $1\r"  ####
expect "ftp>"
send "bye\r"
expect eof
EOT

В выделенной строке я хочу, чтобы ftp получил доступ к основному скрипту stdin.

Спасибо

1 Ответ

2 голосов
/ 26 июня 2011

Я считаю, что ключом к тому, что вы ищете, является команда Expect interact.Вы получите сценарий, подобный следующему:

#!/usr/bin/env expect

# Set these in the Tcl way, not the bash way
set HOST "example.com"
set USER "XXX"
set PASSWD "YYY"

# You should recognize this bit...
spawn ftp $HOST
expect "Name*:"
send "$USER\r"
expect "Password:"
send "$PASSWD\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "prompt\r"
expect "ftp>"

# New stuff starts here
send "put - [lindex $argv 0]\r"
interact {
    "ftp>" { return }
}
send "bye\r"
wait
exit

Я переписал ваш сценарий, чтобы он не использовал документ здесь, потому что помешал бы чтениюcontent (здесь документы представлены как stdin…) и переключил его на использование нескольких более идиоматических способов выполнения действий (основной доступ к идиоматическому аргументу).

Тем не менее, если бы я делал такого родаВ действительности, я бы хотел использовать пакет ftp из Tcllib , поскольку он напрямую взаимодействует с протоколом, а не с использованием потенциально проблемного подпроцесса.(Действительно, если вы собираетесь делать это в Windows, у вас будет , чтобы сделать это таким образом, из-за особенностей работы Expect и FTP.EXE на этой платформе).

...