Você pode repetir sua resposta na entrada padrão do script usando um canal.
echo "My/Path/not/default"| yourscript.sh
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.
Você pode repetir sua resposta na entrada padrão do script usando um canal.
echo "My/Path/not/default"| yourscript.sh
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).
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.