Поскольку вы используете двойные кавычки для тела ожидаемого скрипта, вам приходится иметь дело с как раскрытием переменной оболочки, так и с ожидаемым (, т.е. раскрытием переменной Tcl ). Когда ожидание запущено, переменная оболочки была расширена, поэтому ожидание видит это:
expect password: { send some$value\r }
Итак, теперь вам нужно разобраться с переменными Tcl.
Вы могли бы добавить больше цитирования:
/usr/bin/expect -c "
...
expect password: { send {$SERVICE_PASS}; send \r }
Но это не обязательно :Я бы поместил сценарий ожидания в одинарные кавычки и передал бы параметры оболочки через среду. Таким образом, каждая переменная будет заменена только один раз :либо в оболочке, либо в ожидании, и вы не получите никаких сюрпризов.
export L_SRC_SID L_SID MOUNT_POINT SERVICE_PASS APP_SERVER_1 SRC_MOUNT_POINT
/usr/bin/expect -c ' # <- single quote
set timeout -1
cd /$env(MOUNT_POINT)/$env(L_SID)/apps
spawn scp -pr * apps@$env(APP_SERVER_1):/$env(SRC_MOUNT_POINT)/$env(L_SRC_SID)/apps.
expect {
yes/no { send yes\r ; exp_continue }
password: { send $env(SERVICE_PASS)\r }
}
expect eof
'
В общем, использование sleep
в expect означает, что либо у вас неправильный тайм-аут, либо вы ожидаете не того. Я менял оба.
Предположим, что последовательности ^M
представляют символы CR, т.е.
$ cat -et file.csv
hostname1,this is a test,001^M$
hostname2,this is$
a test,002^M$
hostname3,this$
is$
a$
test,003^M$
затем вы можете соединить строки со следующими, если они не заканчиваются на CR, используя
sed -e :a -e '/\r$/!N; s/\n//; ta' file.csv
напр.
$ sed -e :a -e '/\r$/!N; s/\n//; ta' file.csv | cat -et
hostname1,this is a test,001^M$
hostname2,this isa test,002^M$
hostname3,thisisatest,003^M$