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

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

Executei o seguinte bloco de código (um attempo limite para desinstalar o PHPmyadmin). Ele deveria estar programado para rodar 2 horas à frente, mas executei em um timeout de 2 minutos, só para testar:

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

apt-get purge phpmyadmin -y
PMA_UNINSTALL

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

comandos serão executados usando /bin/sh

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

O que me impede de criar stdin canalizando o bloco de código acima ate como eu poderia chegar a um estado em que pudesse executar comandos canalizados com at, mas usar o Bash livremente logo em seguida, sem interromper ato trabalho?

Responder1

Levei algum tempo para ver seu problema real - você deseja enviar um comando diretamente atem vez de fornecer comando (s) posteriormente, como presumi.

Não há necessidade de um esquema complicado, basta digitar

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

Quando você faz isso desta forma, atnão espera nenhuma entrada posteriormente e você volta para a linha de comando imediatamente.


(mantendo minha resposta original aqui)

A emissão atoferece a possibilidade de listar comandos a serem executados. Você tem que dizer atque terminou:

Pressione CTRL+ D(isso também é conhecido comoFim da transmissão)

Responder2

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

Se você está tentando executar atem apt-get purge phpmyadmin -y2 bashminutos, seu código não fará o que você deseja.

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

De3.6.6 Aqui DocumentosnoManual de referência do Bash:

Este tipo de redirecionamento instrui o shell a ler a entrada da fonte atual até que uma linha contenha apenaspalavra(sem espaços em branco à direita) é visto. Todas as linhas lidas até esse ponto são então usadas como entrada padrão (ou descritor de arquivonsené especificado) para um comando.

Um comando com um documento here é, na verdade, apenas um único comando que deve ser totalmente lido pelo shell antes de ser executado. No seu código, o shell lê a entradaaté PMA_UNINSTALLaparece em uma linha por si só. Depois que isso acontecer, o shellentãousa o conteúdo do documento aqui como descritor de arquivo 50 para o comando bash /dev/fd/50.

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

apt-get purge phpmyadmin -y

Como todo o lado esquerdo do tuboincluindo o documento aquitem sua saída padrão canalizada para at, a entrada atobtida é osaídade bash, que é a saída de apt-get purge phpmyadmin -y. atentão tenta interpretar essa saída - não o seu apt-getcomando, mas seusaída--como uma lista de comandos para executar em /bin/sh.

Portanto, é quase certo que não é isso que você pretende fazer.

Não sei por que você não recebe um prompt do shell logo após inserir esse código. Quando o executo em uma máquina de teste, recebo um prompt do shell em alguns segundos. Se quiser depurar isso, você pode tentar executar apt-get purge phpmyadmin -yinterativamente no bash. Da forma como seu código é escrito, esse comando é executado completamenteantes atretorna ao shell (e antes atpode agendar qualquer coisa). Provavelmente não seria útil depurar ainda mais esse código específico.

informação relacionada