Como enviar muitos comandos para o shell e aguardar o comando por trás das extremidades [fechado]

16

Eu tenho cerca de 20 comandos e tenho que enviar tudo isso para o shell do Unix e copiar o resultado, mas não sei como fazê-lo.

Não tenho certeza sobre qual shell tenho, porque é um pequeno programa conectado ao Mobile Network Management, e com esse pequeno programa temos acesso para enviar comandos por linha e receber os resultados por grito, por esse motivo não posso usar scripts para enviando os comandos.

Comando 1 - Conecte-se a um servidor.

Aguarde até o comando 1 terminar

Comando 2 - Atualize todas as informações do servidor 1 e finalize

Esperar.

Comando 3 . Obtenha algum parâmetro.

... e mais desses comandos.

Eu tentei com cmd1 | cmd2 | cmd3 e cmd1 & cmd2 & cmd3 ecmd1;cmd2

O problema é que ele está cmd1conectado a um RNC (elemento de rede) e demora cerca de 15 segundos, depois disso cmd2faz sentido. mas apenas trabalhe para o primeiro cmd. Alguma pista, como executar isso?

Jonathan Raul Tapia Lopez
fonte
3
Use um script? Ou &&entre comandos.
Bernhard

Respostas:

20

Geralmente apenas cmd1;cmd2;cmd3;cmd4(se você quiser escrevê-lo em uma linha), ou usando cmd1 && cmd2 && cmd3 && cmd4se você não deseja executar o cmd3 quando o cmd2 falhar.

Como alternativa, ;você pode simplesmente escrever um comando por linha.

cmd1
cmd2
cmd3
cmd4

Se você deseja que os comandos sejam executados paralelamente em segundo plano, também pode usar

cmd1 &
cmd2 &
cmd3 &
cmd4 &
wait # for cmd1-4 to finish

Qualquer um desses métodos também pode ser colocado em um script de shell. Há pouca diferença entre o que você escreve em um script de shell e o que você escreve no próprio shell.

frostschutz
fonte
MM: o problema é quando eu envio o cmd1, ele realmente tem que terminar em torno de 6 segundos, o problema é quando ele envia o cmd2 e o cmd1, ainda está processando a falha.
Jonathan Raul Tapia Lopez
4
No cmd1;cmd2caso (ou, cmd1 && cmd2nesse caso), o cmd2 não será executado até que o cmd1 tenha saído (e, portanto, presumivelmente concluído). Portanto, não deve haver nenhum problema - reformule sua pergunta ou forneça um exemplo que as pessoas possam realmente reproduzir.
Frostschutz
Ok, eu vou modificar a pergunta. obrigado
Jonathan Raul Tapia Lopez
2

Você pode procurar sleep, se o seu ambiente permitir. A sequência completa seria então algo como cmd1 && sleep 10s && cmd2.
Aqui está a página do manual relevante para dormir .

LoicAG
fonte
suspensão / espera só é útil se você souber deterministicamente quanto tempo o programa anterior (que pode gerar processo em segundo plano) leva para terminar e sair (IE The Halting Problem) OU se você garante que deseja interromper e executar seu segundo comando após o intervalo já passou, o que pode acontecer se os dois forem assíncronos, mas você ainda desejar algum tempo entre eles. Muito provavelmente, não é o que você deseja. Na prática, pode funcionar. Mas não é confiável.
23817 Justin Reeves
1

Basta usar um script, um arquivo contendo os comandos para executar um após o outro, como:

#!/bin/sh

command-01
command-02
...
command-20

A primeira linha (shebang) diz para executar os seguintes comandos usando /bin/sh, torne o arquivo executável ( chmod u+x your-little-script) e então você pode executá-lo ./my-little-script. Dessa forma, você não deixará nenhum passo fora ;-)

Leia o manual do shell, ele fornece uma linguagem de programação completa. Verifique bash(1)se é isso que está disponível, ou então o shell Korn ksh(1). Eles oferecem muitos recursos úteis para controlar o fluxo de controle em scripts (ou de maneira interativa).

vonbrand
fonte
Obrigado, mas não posso usar escriturários.
Jonathan Raul Tapia Lopez
Por quê? De qualquer forma, a menos que este seja um ambiente muito fascista, você poderá obter o código-fonte: source your-little-script(ou . your-little-scriptabreviado).
vonbrand
Como não tenho acesso direto ao sistema unix, tenho como um mini programa o que permite executar o cmd em linhas e obter o resultado com um grito, e para o uso que vou usar com esses comandos não é prático usar scripts.
Jonathan Raul Tapia Lopez
OK, isso esclarece um pouco as coisas ... Qual ambiente é a origem / destino dos seus comandos? O que você usa para enviar comandos para serem executados? Qual é o ambiente remoto? Qual é a sua configuração lá (você tem uma conta regular que pode ser acessada via sshou PuTTYtalvez?
#
-1

Você poderia executar algo como expect no computador local para enviar cmd1e aguardar o término antes da emissão, cmd2etc. Você precisa descobrir um período razoável para aguardar ou uma saída específica que indique que o comando foi executado, para escrever uma mensagem adequada. Espere script.

Obviamente, cmd1; cmd2; cmd3; cmd4em um comando, os comandos serão executados em sequência, um após o outro.

triplo
fonte