スクリプトはここにあります:https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell
便宜上、ここにあります:
for x in `seq $1 $2`
do
history -d $1
done
これをインクルードディレクトリ(PATHに追加したディレクトリ)に置き、ここで作成した他の多くのスクリプトを実行して、問題なく動作します。
これは、履歴から行を削除するという望ましい結果を生み出しません。実際、何もしません。
履歴コマンドが機能しない理由はありますか?ディレクトリと関係があるのだろうか。
追加情報:
コードをいじって、さまざまなバリエーションを試しました。 echo
を入れたら history
の前 コマンドを実行して実行すると、次の出力が得られます:
[email protected]:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
[email protected]:~$
だから、私には、それは完全に機能するはずのようです。理由がわかりません。このスクリプトは/$HOME / Scripts /から実行されており、PATHに含まれています。また、sudoを使用して実行してみましたが、何も変更されていません。
承認された回答:
一言で言えば、正しく呼んでいないため、機能しません。
まず、スクリプトが#!/bin/bash
で始まっていないためです。 、実際にはbashスクリプトではありません。どのシェルで実行されるかは、どのように呼び出すかによって異なります。 bashコマンドラインから呼び出すと、bashはそれ自体の新しいインスタンスをフォークし(これはとにかく外部コマンドを実行するために発生する必要があります)、スクリプトを実行するのはこの新しいインスタンスです。したがって、スクリプトは親シェルと同じ設定(これまでの履歴を含む)で実行されます。さまざまなオプションで実行されます。特に、スクリプト内のコマンドの履歴追跡はオフになっています(これは、変更する履歴に追加されるため、適切です)。
スクリプトを実行しているbashインスタンスにHISTFILE
があるかどうか 変数セットは、親にエクスポートされたかどうかによって異なります(これは少し奇妙です)。エクスポートされていないために子に設定されていない場合、子スクリプトは終了時に変更された履歴を保存しません。
HISTFILE
の場合 がエクスポートされると、子スクリプトが履歴ファイルを変更します。ただし、すべてのコマンドの後に履歴を再読み込みするようにインタラクティブシェルを構成していない限り、変更された履歴は、新しく開始されたbashのインスタンスによってのみ取得されます。
現在のシェルインスタンスに影響を与えるシェルスニペットを実行する場合は、サブプロセスとして実行するのではなく、現在のシェルインスタンスでそのシェルを実行する必要があります 。ディレクトリの変更や変数の設定など、シェルプロセス自体に影響を与える他のことを実行したい場合も、同様の問題が発生します。.
(「ドット」)またはsource
現在のシェルプロセスでスクリプトを実行するための組み込み。
. idelhistory 300 365
または、これを.bashrc
の関数として定義することもできます。 。