É possível executar, por exemplo, history -w
o shell bash subjacente a partir do script Ruby?
Ou melhor, é possível executar o comando interno do shell bash sabendo apenas seu pid?
A única maneira que encontrei é capturar o sinal trap "history -w" SIGUSR1
e depois enviar o sinal para o processo, mas não tenho certeza se é uma boa prática e o USR1 não é usado pelo bash, também desta forma posso executar no máximo 2 comandos (USR1 e USR2) . E tenho que definir trap antes de usá-lo.
Estou no Mac, então não há SIGRTMIN..SIGRTMAX.
Por que preciso disso:
Eu criei o script Ruby Shell dt
que abre uma nova aba ao lado da atual com o mesmo diretório de trabalho, então escrevinovoTabHere.appque pode fazer a mesma coisa, mas pode fazer isso mesmo se a guia estiver ocupada executando alguma coisa (eu chamo isso usandoFagulha). Mas será muito melhor se o histórico também for o mesmo na aba duplicada e pois dt
posso apenas usar alias dt='history -w; dt'
, mas como posso fazer isso newTabHere.app
?
Responder1
Não existe uma maneira pronta para fazer com que um shell execute um comando, a não ser digitando sua entrada padrão. A coisa mais fácil seria fazer com que o bash verifique algum arquivo, ou execute history -w
, como parte de PROMPT_COMMAND
(um comando que é executado antes de cada prompt).
Eu acho que o que você está procurando é de fatoExportação de histórico em tempo real entre janelas de terminal Bash, e talvezMelhor histórico do bash.
Você também pode considerar usarzsh(disponível na maioria dos repositórios de pacotes Linux/OSX/outros unix) e seus inc_append_history
eshare_history
opções.
Responder2
Para este caso de uso específico, eu recomendaria apenas adicionar history -w
à sua função PROMPT_COMMAND
(ou na função Shell que é invocada a partir daí).
De maneira mais geral, eu sugeriria ter uma fila para comandos solicitados externamente e usá-los PROMPT_COMMAND
para executá-los:
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
Em seguida, em seu script Python, crie um arquivo contendo os comandos que você deseja executar e renomeie-o para sprintf("%s/.bash_queue.d/%u,%s", sys.env("HOME"), pid_of_bash, your_unique_suffix)
.
pid_of_bash
é provavelmente sys.getppid()
ou sys.getsid()
mas isso pode variar dependendo do nível de aninhamento dos seus scripts.
Obviamente você pode escolher sua própria convenção para nomear os arquivos, mas eu sugiro fortemente que você inclua o PID do shell de destino, pelo menos como uma opção.
Se você não se importa com qual shell específico, você também pode acionar com base no pgrp, sid, tty, hora do dia, etc.)
Dica importante:certifique-se de que ninguém mais possa gravar no seu diretório de filas.