Команда scp ведет себя по-разному при использовании с функцией expect

expect -c 'spawn scp -C -o CompressionLevel=9 ~/partFiles/* abc@10.200.4.15:/export/home/abc/; sleep 10; expect password; send "secretPassword\n";interact' 

throws – ~/partFiles/*: No such file or directory

Просто

scp -C -o CompressionLevel=9 ~/partFiles/* abc@10.200.4.15:/export/home/abc/

однако работает отлично.

Зачем? Как это исправить?

Я думаю, что ~ и * расширяются оболочкой, но я полагаю, что scp вызывает scp напрямую, минуя оболочку, чтобы те не расширялись. Вы можете попробовать sh -c команду scp sh -c .

Если это вариант, возможно, просто будет проще поделиться своим ключом с сервером, хотя вам и не нужно этого ожидать.

Используя метод sh , команда будет выглядеть следующим образом:

 expect -c 'spawn sh -c "scp -C -o CompressionLevel=9 ~/partFiles/* abc@10.200.4.15:/export/home/abc/"; sleep 10; expect password; send "secretPassword\n";interact' 

Альтернатива хорошему ответу Эрика: Tcl может делать глобальное расширение

 expect <<'END_EXPECT' set timeout -1 # use this instead of sleep set files [glob -nocomplain ~/partFiles/*] if {[llength $files]} { spawn scp -C -o CompressionLevel=9 {*}$files abc@10.200.4.15:/export/home/abc/ expect password send "secretPassword\r" expect eof } END_EXPECT