bashがなぜまだあるのか知っている人はいますか?歴史的置換デフォルトでは有効ですか?鉱山は長年にわたって.bashrc
含まれていましたが、他の人たちはまだこの機能のために困難を経験しています。set +H
ほぼすべての人がコピー&ペースト機能を持つ端末を使用していることを考えるとそしてreadline
ライブラリにコンパイルされたbashそしてデフォルトでは、履歴の置き換えは対話型シェルでのみ有効になります。実際にその機能を使う理由はありますか?この機能がすべてのシェルに対してデフォルトで無効になっていても、既存のスクリプトは破損しません。
履歴の交換が中断された理由がわからない場合は、以下を試してください。
$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?
(明らかに、この機能がすべてのスクリプトに対してデフォルトで無効になっていて、実行前に結果を確認する機能がある場合は大きな問題があります。shopt -s histverify
)
また見なさい:
ベストアンサー1
すでに慣れている場合は、bash
履歴置換パターンを扱うことは、そのシェルに固有の他の文字を扱うよりももはや面倒ではありません。しかし、シェルに慣れていない人、または単に履歴置換機能を使用したことがない人は、一見無害に見える引用符がないか、二重引用符で囲まれた文字列がそれをトリガーすると明らかに驚くでしょう。
履歴置換が有効な対話型シェルでは、文字の特殊性は!
文字の特殊性とほぼ同じです。つまり、一重引用符で囲まれた文字列を使用するか、内部でエスケープしない限り、どこにでも表示されます。$
\
through とは異なり、$
この記事では歴史的置換を拡張せず、ライン中心なので、〜する 引用符のないコンテキストまたは二重引用符で囲まれたコンテキスト(単独でスキャンする場合は対応する行)に置換がある行で発生します。詳細については、このバグレポートをご覧ください。。
非インタラクティブシェル(スクリプト)でレコードの置き換えを無効にすることは、その機能に「重要な問題」があるためではなく、シェルのコマンド書き込み機能を必要としないためです。スクリプトでは$HISTFILE
すべてのコマンドを保存する必要はなく、履歴の置き換えも同様にスクリプトに依存したいものではありません。
対話型シェルでデフォルトで有効にする必要があるかどうかは議論の余地があります(ただし、この主張に完全に自信はありませんが)。ここ開発者にとって非常に重要ですbash
。)あなたは、ほとんどのユーザーが履歴の拡張に問題があると思うようですbash
。しかし、あなたや私はそれを使うのがどれほど一般的かわかりません。
Unixシェルを使用すると、人々は自分のニーズと好みに合わせてシェルの動作を変更できます。すべてのインタラクティブシェルの履歴の交換をオフにしたい場合は、ファイルset +H
で使用している作業を続行するか、開発者にロビーを介してデフォルトを~/.bashrc
変更bash
してください(確かに助けよりも多くの人を怒らせて混乱させます)。 )))。