Можно ли запустить встроенный скрипт bash из скрипта, отличного от bash?

Можно ли запустить встроенный скрипт bash из скрипта, отличного от bash?

Можно ли запустить, например, 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, времени суток и т. д.)

Важный совет:убедитесь, что никто другой не может записывать данные в ваш каталог очереди.

Связанный контент