ログインシェルとインタラクティブシェル、および環境を設定する必要がある理由とすべきでない理由について、多くの時間を費やしました。さまざまなプロファイルおよびbashrcファイル内の変数、シェル関数など。 この投稿では、プロンプトオプションなどのbash固有のものを〜/ .bashrcで設定する必要があると述べられています。それで私はPS1変数について疑問に思いました。これに関して私が見たすべての例では、export PS1=""のようなものがあります。これはbashの意味しかないので、本当に環境にエクスポートする必要がありますか?は意図した効果を生み出しますが、何かが足りないのではないかと思っています。

回答

正解:PS1は、bashのインタラクティブなインスタンスでのみ意味があるため、~/.bashrcであり、エクスポートしないでください。 PS1は他のシェルでも意味がありますが、プロンプト展開がシェル間で異なるため、意味が異なります。実際、bashのインスタンス間でも、PS1の意味はシェルオプションによって異なるため(少なくともpromptvars)、異なる意味を持つ可能性があります。

PS1.profileから環境にエクスポートすることは、シェルが1つしかなかった1970年代への逆戻りです。それ(Bourneシェル)を使用し、構成ファイルがありませんでした。常に同じシェルを使用し、異なる構成を行わない場合でも、今日でも機能します。ただし、スクリプト専用に設計されていない最新のシェル(csh、ksh)はすべて、bash、zsh、…)インタラクティブに起動したときに構成ファイルを読み取ります(.cshrc.kshrc.bashrc.zshrc、…)なので、1970年代の方法は不要になりました。 PS1およびその他のシェル固有の設定をシェル固有のファイルに設定し、それを環境にエクスポートしないことで、別のシェル構成、別のシェル、または通常のプロンプトの空想を表示できない別の端末。シェル固有のファイルでPS1を設定すると、常に機能しますが、.profileとそれをエクスポートすることは「単純な」場合にのみ機能するので、それを正しい方法で行わない理由はありませんが、Webには悪いチュートリアルがたくさんあり、ディストリビューションのデフォルト設定も悪いです。 C “est la vie

コメント

  • PS1 from .profileは、ログインしていないbashシェルで機能します。'はソースを取得しないためです。これは、ログインシェルはログインシェルからフォークされるため、環境を通じてPS1を継承しますか?
  • @MikeSweeneyはい、その' sの理由' s エクスポート
  • PS1のエクスポートについて間違った考えが広まる1つの方法は、

-これは一般的に人々'の.bashrcファイルに表示され、これがユーザーの場合にのみコマンド完了などをロードします'のインタラクティブターミナルシェル。そこで機能することを確認すると、同じロジックがシェルスクリプトに反映されるため、"が必要です"エクスポートします。代わりにチェックインする必要がありますtty -sまたはtest -t 0を使用するインタラクティブ/ターミナルユーザー。

  • @DouglasDD確かに。たとえば、PS1テストはDebian 'の/etc/profileで長年にわたって行われてきました。 'この悪い習慣がどこで起こったのかわかりません。私はそれがたまたま機能した1つの特定のユースケース(おそらくrloginまたはsshログインを検出する?)から来たと思います。残念ながら、他の多くの場合は失敗するため、このトピックに関する多くの質問がここや他の場所で発生します。
  • @GillesはCLICOLORとどちらか? @DouglasDDは、.bashrcif [[-z $p1]];then return fiチェックに欠陥があることを意味しますか?
  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です