Executei o seguinte bloco de código (um at
tempo 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 at
utilitário parece me impedir de usar o Bash livremente, a menos que eu faça CTRL+ C. At
també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 at
e 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 at
o trabalho?
Responder1
Levei algum tempo para ver seu problema real - você deseja enviar um comando diretamente at
em 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, at
não espera nenhuma entrada posteriormente e você volta para a linha de comando imediatamente.
(mantendo minha resposta original aqui)
A emissão at
oferece a possibilidade de listar comandos a serem executados. Você tem que dizer at
que 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 at
em apt-get purge phpmyadmin -y
2 bash
minutos, 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_UNINSTALL
aparece 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 bash
até 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 at
obtida é osaídade bash
, que é a saída de apt-get purge phpmyadmin -y
. at
então tenta interpretar essa saída - não o seu apt-get
comando, 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 -y
interativamente no bash. Da forma como seu código é escrito, esse comando é executado completamenteantes at
retorna ao shell (e antes at
pode agendar qualquer coisa). Provavelmente não seria útil depurar ainda mais esse código específico.