bash 以外のスクリプトから bash 組み込みを実行することは可能ですか?

bash 以外のスクリプトから bash 組み込みを実行することは可能ですか?

たとえば、history -wRuby スクリプトから基礎となる bash シェルを実行することは可能ですか?
または、pid のみを知って bash シェルの組み込みコマンドを実行することは可能ですか?

私が見つけた唯一の方法は、シグナルをトラップしtrap "history -w" SIGUSR1て、シグナルをプロセスに送信することですが、それが良い方法かどうかはわかりません。また、USR1 は bash によって使用されません。また、この方法では最大 2 つのコマンド (USR1 と USR2) を実行できます。また、使用する前にトラップを定義する必要があります。

私は Mac を使用しているので、SIGRTMIN..SIGRTMAX はありません。

これが必要な理由:

dt私は、同じ作業ディレクトリで現在のタブの隣に新しいタブを開くRubyシェルスクリプトを作成し、次のように記述しました。新しいタブ同じことを実行できますが、タブが何かを実行している場合でもこれを行うことができます(私はこれを次のように呼び出します)スパーク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、時刻などに基づいてトリガーすることもできます。

重要なヒント:他のユーザーがキュー ディレクトリに書き込めないことを確認してください。

関連情報