Eu uso uma carteira interativa spectre-cli
de Spectre , uma moeda similar à Kaspa em seu design. Quando eu quero manualmente obter o saldo da minha carteira, preciso executar
spectre-cli
e então connect
, open
de dentro de spectre-cli
. Tudo isso se parece com isto:
spectre-cli
Spectre Cli Wallet v0.3.16 (type 'help' for list of commands)
$ connect
Connected to Spectre node version 0.3.16 at ws://127.0.0.1:19110
$ open
Enter wallet password:
Your wallet hint is: This is a hint.
$ $
• ****************
• [********]: 4.47042578 SPR 1 UTXOs
spectre:******************************************************
[********] • 4.47042578 SPR $
Eu escrevi um script expect para executar essas etapas para mim (para que a única coisa que eu precisasse digitar fosse minha senha):
#!/usr/bin/expect -f
# Set a timeout (in seconds) for how long to wait for each prompt
set timeout 5
spawn spectre-cli
expect "$ "
send "connect\r"
expect "$ "
send "open\r"
interact
Eu obtenho uma saída inconsistente do script. Cerca de 70% das vezes eu obtenho:
./get_balance_works.exp
spawn spectre-cli
Spectre Cli Wallet v0.3.16 (type 'help' for list of commands)
$ connect
connectopen
command not found: connectopen
$
enquanto o resto do tempo o script funciona como esperado:
./get_balance_works.exp
spawn spectre-cli
Spectre Cli Wallet v0.3.16 (type 'help' for list of commands)
$ connect
$ open
Connected to Spectre node version 0.3.16 at ws://127.0.0.1:19110
Enter wallet password:
Your wallet hint is: This is a hint.
$ $
• ****************
• [********]: 4.47042578 SPR 1 UTXOs
spectre:******************************************************
[********] • 4.47042578 SPR $
Existe uma maneira de fazer o script funcionar conforme o esperado de maneira consistente?
PS: Estou usando um Ubuntu LTS.
Parece que esse utilitário em rust está usando workflow-terminal , que está chamando crossterm ou
termion
para fazer seu trabalho, e isso é mais uma interface de linha de comando do tipo curses , em vez de simples e/s de texto. Pode ser desafiador trabalhar com isso. Para seu uso, a resposta simples pode ser corresponder apenas a for"$"
em vez de"$ "
as, por exemplo, a interface pode estar apenas movendo o cursor para a direita para simular o espaço, e nenhum espaço pode ser correspondido. Isso pode explicar como o\r
no final desend "connect\r"
se perde de alguma forma.Como
expect
trata$
o final de um glob como uma âncora, a string"$"
sempre corresponde a uma string vazia, ou seja, imediatamente, o que for lido. Para impedir que ele trate a string como um glob, você precisa adicionar option-exact
, então use em ambos os lugares:Isso possivelmente depende da rapidez com que os comandos chegam e, portanto, pode ser necessário introduzir atrasos "semelhantes aos humanos"?
da página de manual Expect :