対話型セッションのサブシェル内でbash履歴を変更する

対話型セッションのサブシェル内でbash履歴を変更する

私は処刑した

history > before; (history -d $n); history > after

$nこの行を実行する前に、同じ対話型セッションで入力した最後のコマンドに対応する数字はどこにありますか?

その結果、表示された行は履歴$nから削除されません。history -d現在のシェルで実行するために角かっこを削除すると、ドキュメントに記載されているとおりに機能します。

この行動を理解する方法は?履歴を操作するためのすべてのスクリプトを作成する必要sourceがありますか?

ベストアンサー1

各シェルプロセスには、コマンドライン履歴に関する独自のアイデアがあります。対話型シェルが終了すると、次のシェルが選択できるように記憶された履歴が記録されますが、~/.bash_historyこれはシェルプロセス間の連携範囲です。

コマンドを実行すると、シェルはコマンドを()実行するために独自のコピーを分岐します。history -d子プロセスは親内部状態のコピーから始まり、履歴を知って変更することができます。それそのコピー。

ただし、サブシェルが終了すると、履歴コピー(再作成)が残りの内部状態とともに削除されます。サブシェルは自分がサブシェルであることを知っているので~/.bash_history


ソースのないスクリプトは新しいスクリプトと解釈されるため、履歴をまったく操作できないことが多いです。非対話型シェルは起動時に読みません~/.bash_history

あなたできるコマンドラインで指定して、シェルがインタラクティブシェルのように動作するようにします。

#!/bin/bash -i
echo something

このスクリプトを実行するシェルは、ディスク上で見つかったコマンドにそのコマンド(shebang行sumを含むecho something)を追加します。~/.bash_historyただし、これはもちろん、作成したシェルプロセスのメモリ履歴コピーには影響しません。移動するスクリプトが終了して終了すると、スクリプトによる変更は~/.bash_historyとにかく失われます。

おすすめ記事