bash:履歴-d機能は履歴項目を削除しません。

bash:履歴-d機能は履歴項目を削除しません。

history -d 1一部の投稿を読んだ後でも、関数から項目を削除しない方法はわかりません。

次の関数はコマンドラインに直接移動します。

function test () {
  echo "HISTFILE: '${HISTFILE}'"
  history -d 1
}

次に、次を実行します。

history -c
echo "to remove"
history
    1  echo "to remove"
    2  history
echo $(test)
HISTFILE: '/home/user/.bash_history'
history
    1  echo "to remove"
    2  history
    3  echo $(test)
    4  history

履歴の最初の項目を削除せずにこれを行う方法についてのアイデアはありますか?

答え1

この関数(ただし、標準ユーティリティの名前をオーバーロードするため、おそらく変更する必要があります)は、コマンドの置き換え(別々のサブシェル)で実行されます。

サブシェルは最初の履歴エントリを削除します。ただし、シェル呼び出しの履歴には影響しません。

まず、関数の名前を別のものに変更しtest(エラーは修正されませんが、testすでに標準ユーティリティです)、echo $(some-command)コマンドまたは関数の出力を印刷するために使用を中止します。これはいくつかの問題があるアンチパターンです。関数名を使用してください。すでに独自の出力を行っています。

echo不要なコマンド置換に加えて、出力echoにバックスラッシュが含まれていると、コマンド出力が変更される可能性があります。また、引用符のないコマンド置換は、シェルに$IFSコマンド出力をスペース、タブ、および改行(のすべての文字)に分割し、分割された単語にファイル名のグロービングを適用します。その後、ユーティリティechoは生成されたすべての単語を単語間のスペースを含む1行に出力します。

関連:

関連情報