¿Es posible ejecutar, por ejemplo, history -w
el shell bash subyacente desde el script Ruby?
O mejor, ¿es posible ejecutar el comando incorporado para bash shell sabiendo solo su pid?
La única forma que encontré es atrapar señales similares trap "history -w" SIGUSR1
y luego enviar señales para procesar, pero no estoy seguro de que sea una buena práctica y bash no usa USR1, también de esta manera puedo ejecutar un máximo de 2 comandos (USR1 y USR2) . Y tengo que definir trampa antes de usarla.
Estoy en Mac, por lo que no hay SIGRTMIN..SIGRTMAX.
Por qué necesito esto:
Creé el script Ruby Shell dt
que abre una nueva pestaña junto a la actual con el mismo directorio de trabajo, luego escribínuevaTabHere.appque puede hacer lo mismo pero puede hacerlo incluso si la pestaña está ocupada ejecutando algo (lo llamo usandoChispa - chispear). Pero será mucho mejor si el historial también es el mismo en la pestaña duplicada y dt
puedo usarlo alias dt='history -w; dt'
, pero ¿cómo puedo hacer esto newTabHere.app
?
Respuesta1
No existe una forma estándar de hacer que un shell ejecute un comando, aparte de escribir su entrada estándar. Lo más fácil sería hacer que bash verifique algún archivo o lo ejecute history -w
como parte de PROMPT_COMMAND
(un comando que se ejecuta antes de cada mensaje).
Creo que lo que buscas es, de hecho,Exportación de historial en tiempo real entre ventanas de terminal Bash, y quizáMejor historial de bash.
También podrías considerar usarzsh(disponible en la mayoría de los repositorios de paquetes de Linux/OSX/otros Unix) y inc_append_history
susshare_history
opciones.
Respuesta2
Para este caso de uso específico, recomendaría simplemente agregarlo history -w
a su PROMPT_COMMAND
(o en la función de shell que se invoca desde allí).
De manera más general, sugeriría tener una cola para los comandos solicitados externamente y usarla PROMPT_COMMAND
para ejecutarlos:
run_prompt_queue() {
local f
for f in ~/.bash_queue.d/$$-*
do
[[ -f $f ]] || continue # still works without nullglob
. "$f"
rm -fv "$f"
done
}
PROMPT_COMMAND+=$'\n run_prompt_queue'
rm -v "$HOME/.bash_queue.d/$$-"* # clear random leftovers when PID is recycled
Luego, en su secuencia de comandos Python, cree un archivo que contenga los comandos que desea ejecutar y luego cámbiele el nombre a sprintf("%s/.bash_queue.d/%u,%s", sys.env("HOME"), pid_of_bash, your_unique_suffix)
.
pid_of_bash
es probablemente sys.getppid()
o sys.getsid()
pero eso puede variar dependiendo del nivel de anidamiento de sus scripts.
Obviamente, puede elegir su propia convención para nombrar los archivos, pero le sugiero encarecidamente que incluya el PID del shell de destino, al menos como una opción.
Si no le importa qué shell en particular, también puede activarlo según pgrp, sid, tty, hora del día, etc.)
Consejo importante:asegúrese de que nadie más pueda escribir en su directorio de cola.