O TCL é simples . Nesse caso, como mosvy
indica nos comentários, use {...}
para desativar a interpolação do código de shell complicado. No entanto, o \r
para inserir o comando não deve ter escape, e o procedimento send
deseja uma única cadeia, portanto, junte a cadeia juntos ou use dois send
chamadas:
#!/usr/bin/env expect
catch {exec rm foo}
log_file expect.log
spawn -noecho sh
expect -ex {$ }
send {df | awk '/\//{print $NF}' > foo}
send "\r"
expect -ex {$ }
send -- {exit}
send "\r"
expect eof
Isso pode ser melhorado com um procedimento sendline
para a tarefa que impede que o \r
atrapalhe o código:
#!/usr/bin/env expect
proc sendline {line} { send -- "$line\r" }
spawn -noecho sh
expect -ex {$ }
sendline {df | awk '/\//{print $NF}' > foo}
expect -ex {$ }
sendline "exit"
expect eof
Se você precisar de interpolação, então o backwhacking será necessário, embora, nesse caso, seja melhor eliminar o código do shell e, em vez disso, chamar um programa diretamente no sistema remoto que execute a tarefa necessária ou produza a saída necessária consumir forma.