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
してください(確かに助けよりも多くの人を怒らせて混乱させます)。 )))。
答え2
履歴の交換が便利です。例えば
% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.
答え3
社会的/文化的慣性。
この質問は、人間がどのように働くかについての質問空間に属するので、機能の存在についての意見は示さず、そのような観点から答えます。しなければならないデフォルトではオンになっています。
まず、相手を確実に理解するには、その機能をオフにすることを試してみると、相手があなたを迷惑にすることを検討してください。会議その機能をオンにするために努力する必要があるように感じます。
上記の内容とbash
実際にこの機能を使用しているユーザーが多いという事実により、この機能を基本的に削除またはオフにするという提案は、基本的にこの機能に慣れた人々の抵抗にぶつかりました。
さらに、bash
これは多くの人々の基本的なシェルです(ただデフォルトのログインまたはシステムシェルという意味ですが、心理的な意味です。シェルの参照フレームがあり、bash
これが最初に学ぶシェルであれば、それが!
特別なシェル文字であるという事実は自然で自動的に感じられるでしょう(または少なくとも最初に学ぶとき、それはシェルのしくみは許容される多くの欠点の1つです)。
考えてみると、多くのbash
ユーザーが履歴の代替構文に直面します。ポジティブ背景:初めて学ぶとき、彼らはそれについて読んだり、誰かがそれを見せたり、それがどのように役立つかを知りますbash
。
ボンのような他の殻の外の世界でのみ!
特別な感じに引き付けられます。そしてしたがって、否定的に見る傾向があります。なぜなら、その機能がまったくないシェルに慣れているなら、急いで何かを処理しようとするときに初めてそのようなことをすることになるからです。あなたは問題にさらされます。
要約:ほとんどのユーザーはあまり気にしません。基本いずれにせよ、一部のユーザーはこの機能を好み、すでに彼から強力な利点を享受していますが、それを克服するために積極的に反対する人はほとんどいません。
答え4
Bash履歴の交換がデフォルトでまだ有効になっているのはなぜですか?
多くの人がそれを使用し、インタラクティブなbashシェルを使用している人は、おそらくしなければならない問題を避けるための規則を学ぶと、一般的にそれが有害さよりも役立つことがわかります。
私の.bashrcには長年にわたってset + Hが含まれていましたが、他の人たちはまだこの機能のために苦しんでいます。
したがって、使用しない機能と言っても、ほとんどのユーザーが使用しないわけではありません。基本設定の変更を要求できますが、考慮すべき事項 A)ケア、そしてB)あなたの方法が好きな人の割合。その人ケアそして好きではない無効になっている可能性があります。これを変更すると、新しいコンピュータからアカウントを取得するのに役立ちます。人々はそう思います。ケアそしていいね後で使用するすべてのコンピュータと取得するすべてのアカウントで設定を更新する必要があります。
ほぼすべての人がコピー&ペースト機能を持つ端末を使用していることを考えると
私の考えでは、これはよりかさばるオプションです...
本当にこの機能を使うようになった理由はありますか?この機能がすべてのシェルに対してデフォルトで無効になっていても、既存のスクリプトは破損しません。
はい、人々はそれが役に立つと思います。以前は起きてチャンネルだけ回せばいいのですがリモコンが何の役に立ちますか?
(この機能がすべてのスクリプトに対してデフォルトで無効になっていて、実行前に結果を確認する機能であるshopt -s histverifyがある場合は、明らかにこの機能に深刻な問題があります。)
記録は実際にはスクリプトでは意味がありませんが、もっと重要なのはセキュリティ上の問題を引き起こす可能性があるということです。あなたの場合は、一重引用符を使用して問題を回避できます。これが私に問題を起こした記憶がないのに、「重要な問題」があるとどう言うのか分からない。これは実際の問題を引き起こしますか、それとも新しいコンピュータにデフォルト値を設定する必要があるのか迷惑ですか?
本当にお金を稼ぎたい場合は、エスケープしたり、単一引用符を使用するのとどう違うのかわかりません。
$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it