Como passar respostas ao script CLI via argumentos?

4

Estou escrevendo um script CLI que faz uma série de perguntas antes de fazer algumas coisas. Como posso passá-los como argumentos para que eu não tenha que continuar inserindo-os toda vez que eu quiser testar meu script?

Basicamente, ele deve passar 4 itens para STDIN, como "text1 [ENTER] text2 [ENTER] text3 [ENTER] text4 [ENTER]" automaticamente.

Sim, eu poderia modificar meu script para realmente ler os argumentos do shell, mas eu não quero fazer isso dessa forma, já que ele deve rodar mais como um assistente.

Procurando por algo como

SOMEPROGRAM myscript arg1 arg2 arg3 arg4

ou

SOMEPROGRAM arg1 arg2 arg3 arg4 | myscript

Ou algo parecido. Existe tal programa?

    
por mpen 09.09.2011 / 19:35

7 respostas

6

Entendo que você não deseja modificar myscript .

Com relação à segunda solução solicitada, você pode usar printf :

printf '%s\n' text1 text2 text3 text4 | myscript

para que, definindo um apelido para SOMEPROGRAM como:

alias SOMEPROGRAM="printf '%s\n'" 

você pode ligar efetivamente para

SOMEPROGRAM text1 text2 text3 text4 | myscript

O primeiro formulário é ambíguo (do ponto de vista de SOMEPROGRAM), porque não sabe onde as opções myscript terminam e os parâmetros de texto iniciam, a menos que myscript seja efetivamente invocado sem nenhuma opção. Neste caso, você poderia usar uma função:

SOMEPROGRAM() {
  myscript=""
  shift
  printf '%s\n' "$@" | "$myscript"
}

para que você possa ligar efetivamente

SOMEPROGRAM myscript text1 text2 text3 text4
    
por enzotib 09.09.2011 / 19:37
2

Então, basicamente, você quer passar cada argumento como uma linha para um programa filho. Abaixo está um script que percorre todos os argumentos passados ti SOMEPROGRAM e os imprime como uma linha. Você pode passar uma linha vazia ("entrar sem inserir algo antes") passando um argumento vazio como em SOMEPROGRAM yes '' | myscript .

#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to  a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
    echo "$arg"
done

Se você sempre precisa responder "sim" ao seu script, use o coreutil yes :

yes | myscript

Se você precisar passar algum outro valor, diga "não":

yes 'no' | myscript
    
por Lekensteyn 09.09.2011 / 21:23
1

Você pode passar os parâmetros, mas não vai funcionar, você também terá que modificar o script bash para aceitar os parâmetros da linha de comando também.

    
por woohoo 09.09.2011 / 20:15
1

Se você está escrevendo um script, então use apenas getopts para que os argumentos sejam passados para os scripts e então você pode usar esses argumentos como quiser? Isso é algo que você está procurando?

link

    
por user20881 09.09.2011 / 22:24
1

Para casos simples, a maneira como a enzotib a descreve com stdin de tubulação de um arquivo parece razoável. Considere este script:

#!/bin/bash
read -p "What's your name?" name 
echo $name 
read -p "Age?" age 
echo $age
echo "Your name is " $name " and your age is "$age

invoque-o com:

echo -e "Foobar\n14\n" | ./namenage.sh 

O -e é para ativar sequências de escape como \n ewline.

Foobar
14
Your name is  Foobar  and your age is 14

Note como, magicamente, o bash não imprime o prompt para leitura.

No entanto, para casos mais complicados, há um programa chamado expect para lidar com programas CLI interativos, onde é necessário aguardar o próximo prompt, antes de inserir o segundo valor, e acho que você pode até mesmo se ramificar sob condições .

    
por user unknown 10.09.2011 / 01:46
1

Com o bash, você pode fazer isso:

myscript << END
arg1 
arg2
arg3
arg4
END

ou

myscript <<< $'arg1\narg2\narg3\narg4\
    
por glenn jackman 10.09.2011 / 02:09
1

Tenho certeza de que você está procurando esperar .

edit: exemplo adicionado

  
#!/bin/bash  
USER="root"  
HOST="192.168.1.111"  
PASS="secret"  
expect -c "  
spawn ssh $USER@$HOST  
expect \"password:\"  
send \"$PASS\r\"  
interact  
"  

- de este blog

    
por RobotHumans 21.02.2012 / 09:28