たとえば、history -w
Ruby スクリプトから基礎となる 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、時刻などに基づいてトリガーすることもできます。
重要なヒント:他のユーザーがキュー ディレクトリに書き込めないことを確認してください。