¿Por qué no puedo usar bash libremente después de usar la utilidad "At"? (No se puede insertar stdin hasta ctrl+c)

¿Por qué no puedo usar bash libremente después de usar la utilidad "At"? (No se puede insertar stdin hasta ctrl+c)

Ejecuté el siguiente bloque de código (un attiempo de espera para desinstalar PHPmyadmin). Debería estar programado para ejecutarse 2 horas antes, pero lo ejecuté en un tiempo de espera de 2 minutos, solo para probarlo:

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

apt-get purge phpmyadmin -y
PMA_UNINSTALL

La atutilidad parece impedirme usar Bash libremente, a menos que lo haga CTRL+ C. Attambién muestra la siguiente advertencia, que es normal y está codificada en el código fuente de la utilidad. Cuando hago CTRL+, Cla advertencia desaparece y puedo volver a usar Bash con regularidad.

Los comandos se ejecutarán usando /bin/sh.

No digo que sea la advertencia la que me impide usar Bash regularmente mientras aparezca. Sé que la advertencia es simplemente una salida estándar y que algo más podría impedirme crear una entrada estándar.

¿Qué me impide crear una canalización estándar con el bloque de código anterior aty cómo podría alcanzar un estado en el que pueda ejecutar comandos canalizados con at, pero usar Bash libremente inmediatamente después sin interrumpir atel trabajo?

Respuesta1

Me tomó algo de tiempo ver su problema real: desea enviar un comando directamente aten lugar de proporcionar comandos después, como supuse.

No es necesario un esquema complicado, simplemente escriba

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

Cuando lo hace de esta manera, atno espera ninguna entrada posterior y regresa a la línea de comando inmediatamente.


(manteniendo mi respuesta original aquí)

Emitir atle brinda la posibilidad de enumerar los comandos para ejecutar. Tienes que decir atque ya terminaste:

Presione CTRL+ D(Esto también se conoce comoFin de la transmisión)

Respuesta2

TL;DR: Esos comandos no parecen hacer lo que probablemente pretendes.

Si está intentando ejecutar aten apt-get purge phpmyadmin -y2 bashminutos, entonces su código no hará lo que usted desea.

El comando a la izquierda de la tubería ( |) tiene su documento aquí como entrada estándar. Ese comando ni siquiera se ejecuta hasta que el shell haya leído su documento completo aquí.

De3.6.6 Aquí documentosen elManual de referencia de bash:

Este tipo de redirección le indica al shell que lea la entrada de la fuente actual hasta que aparezca una línea que contenga solopalabra(sin espacios en blanco al final). Todas las líneas leídas hasta ese punto se utilizan como entrada estándar (o descriptor de archivo).nortesinortese especifica) para un comando.

Un comando con un documento aquí es, en efecto, solo un comando que el shell debe leer completamente antes de ejecutarlo. En su código, el shell lee la entradahasta PMA_UNINSTALLaparece en una línea por sí solo. Una vez que esto ha sucedido, el caparazónentoncesutiliza el contenido del documento aquí como descriptor de archivo 50 para el comando bash /dev/fd/50.

Ese comando ni siquiera inicia una nueva instancia bashhasta que el documento aquí se haya leído por completo. Cuando bashse ejecuta, ejecuta este comando:

apt-get purge phpmyadmin -y

Dado que todo el lado izquierdo de la tuberíaincluyendo el documento aquítiene su salida estándar canalizada a at, la entrada atque obtiene es laproducciónde bash, que es la salida de apt-get purge phpmyadmin -y. atluego intenta interpretar esa salida, no su apt-getcomando, sino suproducción--como una lista de comandos para ejecutar en /bin/sh.

Así que es casi seguro que esto no es lo que pretendes hacer.

No estoy seguro de por qué no aparece un mensaje de shell inmediatamente después de ingresar ese código. Cuando lo ejecuto en una máquina de prueba, aparece un mensaje de shell en un par de segundos. Si desea depurar esto, puede intentar ejecutarlo apt-get purge phpmyadmin -yde forma interactiva en bash. La forma en que está escrito su código, ese comando se ejecuta completamenteantes atregresa al shell (y antes atpuede programar cualquier cosa). Sin embargo, probablemente no sería útil depurar más este código en particular.

información relacionada