はい。履歴の拡張は、対話型シェルに対してのみデフォルトで有効になっています。
シェルスクリプトで有効にするには、次のように記述します。
set -H
対話型シェルでこれを無効にするには、次のように記述します。
set +H
履歴の拡張が現在有効になっているかどうかを判断するには、次のコードのなんらかの形式を使用します。
case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac
シェルクラスの指導を開始するにあたり、私はマニュアルを徹底的に掘り下げ、「インタラクティブシェル」が実際に何であるかを確立しようとしました。これはワールプールの質問なので、いくつかの問題を解決しましょう。
シェルには多くのオプションがあります。これらのオプションの一部は、シェルが制御端末を持っている場合(または-i
、何とか何とか、以下を参照)で開始されると、さまざまな方法で初期化されます。
シェルのオプションはすべて個別に変更できます。
「インタラクティブシェル」は、正確に定義しようとする場合の誤解を招く用語です。 これは実際にはオプション設定のコレクションにすぎません。
どの設定がシェルをインタラクティブにするかどうかについての質問に答えることは不可能です。それはとんでもないことになります。それは正確に同じ哲学的問題テセウスの船。
インタラクティブシェルを起動したが、履歴の展開を無効にした場合、--noediting
フラグを使用したり、設定--norc
したりexpand_aliases
、オフにしたりするなどの場合、インタラクティブなシェルはどのような意味ですか?または、いつインタラクティブでなくなるのですか?これらの質問には答えられません。
真実は、「インタラクティブ」は、さまざまなシェルオプションのコレクションの便利なラベルにすぎないということです。同様に「非インタラクティブ」。同じこと; それぞれを個別に変更できる動作のコレクションです。
結論:シェルは、「対話式」で起動したときと「非対話式」で起動したときの動作が異なります。起動後にこれらの用語を正確に定義しようとするのはばかげています。シェルの個々のオプションを見て、その動作を理解してください。
自分の研究に加えて、このサイトに広範囲に投稿したことを忘れていました。