Por que não posso usar o bash livremente depois de usar o utilitário “At”? (Não é possível inserir stdin até ctrl + c)

4

Eu executei o seguinte bloco de código (um tempo limite at para desinstalar o PHPmyadmin). Ele deve ser programado para executar 2 horus à frente, mas eu corri em um tempo limite de 2 minutos, apenas para testá-lo:

bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'

apt-get purge phpmyadmin -y
PMA_UNINSTALL

O utilitário at parece me impedir de usar o Bash livremente, a menos que eu faça CTRL + C . At também solicita o seguinte aviso, que é normal e codificado no código-fonte do utilitário. Quando eu faço CTRL + C o aviso desaparece e eu posso usar o Bash regularmente novamente.

  

os comandos serão executados usando / bin / sh

Eu não digo que é o aviso que me impede de usar o Bash regularmente, desde que ele apareça. Eu sei que o aviso é apenas stdout e outra coisa pode me impedir de criar stdin.

O que me impede de criar stdin piping o bloco de código acima com at e como eu poderia chegar a um estado quando eu poderia executar comandos canalizados em, mas usar Bash livremente logo depois, sem interromper at para trabalhar? p>     

por JohnDoea 02.01.2017 / 04:06

2 respostas

5

Demorei algum tempo para ver seu verdadeiro problema - você quer enviar diretamente um comando para at em vez de fornecer comando (s) depois que eu assumi.

Não há necessidade de um esquema complicado, apenas digite

echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'

Quando você faz desta forma at não espera nenhuma entrada depois e você retorna para a linha de comando imediatamente.

(mantendo minha resposta original aqui)

A emissão de at dá a você a possibilidade de listar comandos a serem executados. Você precisa dizer a at que está pronto:

Pressione CTRL + D (Isto também é conhecido como Fim da Transmissão )

    
por guntbert 02.01.2017 / 18:57
4

TL; DR: Esses comandos não parecem fazer o que você provavelmente pretende.

Se você estiver tentando tornar at execute apt-get purge phpmyadmin -y de bash em 2 minutos, seu código não fará o que você deseja fazer.

O comando à esquerda do pipe ( | ) tem seu documento aqui como sua entrada padrão. Esse comando não é executado até que o shell tenha lido seu documento completo aqui.

De 3.6.6 aqui documentos no Manual de Referência do Bash :

  

Este tipo de redirecionamento instrui o shell a ler a entrada do   fonte atual até uma linha contendo apenas palavra (sem   espaços em branco) é visto. Todas as linhas lidas até esse ponto são usadas   como a entrada padrão (ou descritor de arquivo n se n for especificado) para   um comando.

Um comando com um documento aqui é, na verdade, apenas um único comando que deve ser totalmente lido pelo shell antes de ser executado. Em seu código, o shell lê a entrada até que PMA_UNINSTALL apareça em uma linha sozinho. Uma vez que isso aconteceu, o shell então usa o conteúdo do documento here como descritor de arquivo 50 para o comando bash /dev/fd/50 .

Esse comando nem sequer inicia uma nova instância de bash até que o documento here tenha sido totalmente lido. Quando bash é executado, ele executa este comando:

apt-get purge phpmyadmin -y

Como todo o lado esquerdo do tubo incluindo o documento aqui tem sua saída padrão canalizada para at , a entrada at gets é a saída de bash , que é a saída de apt-get purge phpmyadmin -y . at , em seguida, tenta interpretar essa saída - não o comando apt-get , mas sua saída - como uma lista de comandos a serem executados em /bin/sh .

Então, isso quase certamente não é o que você pretende fazer.

Não sei por que você não recebe um prompt do shell de volta logo após inserir o código. Quando eu o executo em uma máquina de teste, recebo um aviso de shell em alguns segundos. Se você quiser depurar isso, você pode tentar executar apt-get purge phpmyadmin -y interativamente no bash. A maneira como seu código é escrito, esse comando é executado completamente antes at retorna para o shell (e antes que at possa planejar qualquer coisa). Provavelmente não seria útil depurar esse código específico ainda.

    
por Eliah Kagan 09.01.2017 / 17:42