Como posso responder a um prompt dentro de um script de shell executado em segundo plano?

6

Estou programando a instalação de software no servidor HP-UX. Depois que o script é iniciado, ele fornece um prompt onde devo inserir o caminho de instalação. Eu preciso passar o caminho para o script para que ele possa continuar a ser executado. Existe apenas 1 lugar no script onde esta necessidade existe.

O prompt do script é: Pressione ENTER para o caminho padrão ou insira o caminho para instalar o software:

Eu não quero usar o caminho padrão, então devo inserir um novo caminho. Mas esse script será executado em segundo plano e eu preciso fornecer o caminho. Não tenho certeza da resposta exata em forma de script.

    
por 37Scheper 01.06.2016 / 17:09

3 respostas

2

Você pode repetir sua resposta na entrada padrão do script usando um canal.

echo "My/Path/not/default"| yourscript.sh
    
por 01.06.2016 / 17:39
2

Se você puder fornecer todas as entradas quando o script for iniciado, faça-o redirecionando o programa. entrada. Ou seja, em vez de executar /path/to/installer , execute

{ echo '/the/path/where/to/install';
  echo 'answer to the second prompt';
} | /path/to/installer

ou use um documento aqui :

/path/to/installer <<'EOF'
/the/path/where/to/install
answer to the second prompt
EOF

Se você quiser interagir com um programa de tempos em tempos, mas usar seu terminal para outras coisas, execute o programa em um multiplexador de terminal como, por exemplo, Tela ou tmux . Com a tela, inicie uma sessão executando screen e inicie o programa. Para fazer outra coisa, pressione Ctrl + A , c para criar uma segunda janela, em seguida, Ctrl + A , n para navegar entre as janelas. Para sair de Screen mas deixar o programa em execução, pressione Ctrl + A , d (“desanexar”). Para voltar à sessão de tela existente, execute screen -rd ( screen sem nenhuma opção iniciar uma nova sessão).

    
por 02.06.2016 / 02:13
0

Para fornecer uma resposta automática, você pode usar uma das seguintes opções:

insaller.sh < an_input_file

ou

command-line | installer.sh

Há algo a ser observado se o script installer.sh estiver usando read -p , como no exemplo abaixo:

read -p "Press ENTER for default path or enter path to install software:" answer

man bash especifica que nada é impresso se a entrada padrão não for um terminal.

Se esta é a sua situação, você pode tentar algo estranho:

( sleep 30 ; printf "/my/own/path\n" ) | insaller.sh

Você deve adaptar o número de segundos ( 30 no exemplo acima) à sua situação.

Se acontecer de que read -p não é usado dentro do script de instalação, você pode tentar este GNU solution:

 tempdir="$(mktemp -d)"
 mkfifo  "${tempdir}"/input
 touch "${tempdir}"/output.log
 ./installer.sh <"${tempdir}"/input >"${tempdir}"/output.log 2>&1 &
 installerpid=$!
 tail --pid=$installerpid -fn 1 "${tempdir}"/output.log | ( fgrep -q "Press ENTER for default path or enter path to install software:"; printf "/new/path\n" ) >> "${tempdir}"/input &

 # ... do stuff


 # before ending the script, just wait that all background processes stop
 wait
 rm -f "${tempdir}"/input "${tempdir}"/output.log

A idéia é usar duas linhas de comando em segundo plano, uma para o script de instalação e outra para aguardar o prompt e fornecer a resposta.

Um pipe nomeado ( input ) e um arquivo regular ( output.log ) são usados para comunicação.

tail --pid=$installerpid -fn 1 "${tempdir}"/output.log imprime linhas, pois estão escritas no arquivo output.log . Teminates quando o script do instalador termina.

( fgrep -q ... ; printf .. ) >> ...input : bloqueia até que o prompt seja encontrado e fornece o novo caminho para o script de instalação.

    
por 03.06.2016 / 15:08