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行に出力します。
関連:
- いつ二重引用符が必要ですか?
- なぜprintfがechoより優れているのですか?(質問に関連していますが、この場合に使用し
echo
なければならないと言うわけではありませんprintf
!)