Можно ли запустить, например, history -w
базовую оболочку bash из скрипта ruby?
Или лучше запустить встроенную команду для оболочки bash, зная только ее pid?
Единственный способ, который я нашел, это перехватывать сигнал, как trap "history -w" SIGUSR1
и затем отправлять сигнал процессу, но я не уверен, что это хорошая практика, и USR1 не используется bash, также таким образом я могу выполнить максимум 2 команды (USR1 и USR2). И мне нужно определить ловушку перед ее использованием.
У меня Mac, поэтому SIGRTMIN..SIGRTMAX отсутствует.
Зачем мне это нужно:
Я создал скрипт оболочки Ruby dt
, который открывает новую вкладку рядом с текущей с тем же рабочим каталогом, затем я написалnewTabHere.appкоторый может делать то же самое, но может делать это даже если вкладка занята выполнением чего-либо (я называю это использованиемИскра). Но было бы намного лучше, если бы история была такой же и в дублированной вкладке, и dt
я мог бы просто использовать alias dt='history -w; dt'
, но как это сделать из newTabHere.app
?
решение1
Нет готового способа заставить оболочку выполнить команду, кроме как ввести ее на ее стандартном вводе. Проще всего было бы заставить bash проверить какой-то файл или запустить history -w
, как часть PROMPT_COMMAND
(команды, которая выполняется перед каждым приглашением).
Я думаю, что на самом деле ты ищешьЭкспорт истории в реальном времени между терминальными окнами Bash, и, возможноЛучшая история bash.
Вы также можете рассмотреть возможность использованиязш(доступно в большинстве репозиториев пакетов Linux/OSX/других Unix) и его inc_append_history
иshare_history
параметры.
решение2
Для этого конкретного случая использования я бы рекомендовал просто добавить history -w
к вашему PROMPT_COMMAND
(или в функцию оболочки, которая оттуда вызывается).
В более общем плане я бы предложил создать очередь для команд, запрошенных извне, и использовать PROMPT_COMMAND
для их выполнения:
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
Затем в скрипте Python создайте файл, содержащий команды, которые вы хотите запустить, и переименуйте его в sprintf("%s/.bash_queue.d/%u,%s", sys.env("HOME"), pid_of_bash, your_unique_suffix)
.
pid_of_bash
вероятно sys.getppid()
, или , sys.getsid()
но это может варьироваться в зависимости от уровня вложенности ваших скриптов.
Разумеется, вы можете выбрать собственный способ именования файлов, но я настоятельно рекомендую вам включить PID целевой оболочки, по крайней мере в качестве опции.
Если вам все равно, какая именно оболочка используется, вы также можете активировать ее на основе pgrp, sid, tty, времени суток и т. д.)
Важный совет:убедитесь, что никто другой не может записывать данные в ваш каталог очереди.