O script cat in expect adiciona nova linha ao final da string

3

Eu tenho o seguinte em um script expect

spawn cat version
expect -re 5.*.*
set VERSION $expect_out(0,string)
spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm

O comando cat está obtendo a versão correta, mas parece que está adicionando uma nova linha. Desde que eu espero que a saída seja a seguinte:

dist/foo-5.x.x-1.i686.rpm

mas estou recebendo incluindo o erro no começo:

cannot access file dist/foo-5.x.x
-1.i686.rpm

Por que expect está adicionando uma nova linha à saída do comando cat ? Existe alguma maneira de que isso não seja feito ou para corrigir a saída do comando cat?

    
por jgr208 12.06.2017 / 15:26

3 respostas

5

O TCL pode ler um arquivo diretamente sem a complicação de spawn cat :

#!/usr/bin/env expect

# open a (read) filehandle to the "version" file... (will blow up if the file
# is not found)
set fh [open version]
# and this call handily discards the newline for us, and since we only need
# a single line, the first line, we're done.
set VERSION [gets $fh]

# sanity check value read before blindly using it...
if {![regexp {^5\.[0-9]+\.[0-9]+$} $VERSION]} {
    error "version does not match 5.x.y"
}

puts "spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm"
    
por 12.06.2017 / 16:34
5

É muito provável que você tenha um caractere de nova linha no final do seu arquivo version , por isso expect não é muito adicionar uma nova linha, pois está fazendo cegamente o que você disse. IMHO, seria mais fácil ajustar o script de espera para remover qualquer nova linha antes de gerar o comando rpm , e isso garantiria que você não voltasse a ter esse problema novamente se uma edição diferente colocasse a nova linha de finalização mesmo depois de você ve removido.

Mesmo que você não tenha uma nova linha de término no arquivo version , eu ainda aconselho a adicionar uma chamada strip() (ajustando a sintaxe correta para expect , é claro) para lidar com essa situação .

    
por 12.06.2017 / 15:31
1

Como diz Thrig, você deve ler o arquivo diretamente. Além disso, usando cat , como John diz que haverá uma nova linha no final do arquivo, e isso se tornará \r\n (carriage-return, newline) ao passar pelo pty de spawn . Assim, você pode alterar seu padrão de expressão regular para capturar apenas esses caracteres:

expect -re "(5.*)\r\n"
set VERSION $expect_out(1,string)

Observe como pedimos o índice 1, a captura () , não 0, a correspondência do padrão inteiro.

Como alternativa, você pode remover o espaço em branco com o comando tcl

set VERSION [string trim $expect_out(0,string)]

Note que você está confundindo os padrões glob e regexp na sua linha esperada: 5.*.* como um padrão glob corresponderá ao seu estilo de entrada 5.x.x . Usar -re significa que você deve usar apenas regexp 5.* , que corresponde a todos no final.

    
por 12.06.2017 / 19:28