¿Es posible ejecutar bash integrado desde un script que no sea bash?

¿Es posible ejecutar bash integrado desde un script que no sea bash?

¿Es posible ejecutar, por ejemplo, history -wel 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" SIGUSR1y 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 dtque 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 dtpuedo 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 -wcomo 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_historysusshare_history opciones.

Respuesta2

Para este caso de uso específico, recomendaría simplemente agregarlo history -wa 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_COMMANDpara 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_bashes 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.

información relacionada