
私は処刑した
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
とにかく失われます。