web-dev-qa-db-ja.com

なぜ人々はbash_profileを逆ではなくbashrcから調達するのですか?

ほとんどのターミナルエミュレータはデフォルトでログインとしてローカルセッションを実行しないようです。そのため、bash_profileではなくbashrcをロードします。では、なぜほとんどの人がすべてをbash_profileに入れ、bashrcにそれをソースさせるのでしょうか。 「ほとんどの人」とは、これまでに見たほとんどの人を意味します。多分それは私が思うほど普及していないでしょう。

そこに構成を配置してbashrcソースbash_profileを使用する代わりに、すべてをbashrcに配置し、bash_profileソースを使用する方が理にかなっており、Linuxコミュニティとの整合性が高くなりませんか?

ITerm2について良いことを聞いたことがありますが、そのように聞こえます。ローカルで実行していると、他のほぼすべてのターミナルエミュレーター(デフォルトのOSXターミナルを除く)がbashrcをロードすることになります。一方が他方を調達する限り、それは重要ではありませんが、なぜbash_profileを好むことが標準であるのか混乱していますか?

マイナーサイドノート:iTerm2について間違えました。デフォルトではTerminal.appと同じようにログインセッションを実行しますが、両方のエミュレーターにそれを変更できるオプションがあるようです。

7
ivan

人々はbash_profileをbashrcから調達しますが、その逆ではありません地域の慣習により

bashでスタートアップファイルを構成する方法について私が読んだすべての意見は、主に地域の慣習に基づいています。地元の大会では通常、ログインやインタラクティブ性のないケースについてはあまり説明されていないため、全体像については言及されていません。面白いのは、私が調べたところですが、あるスタートアップファイルと他のスタートアップファイルに変数を配置する理由についてのすべての話で、cronについて言及する人はほとんどいません。実際、次のようなコメントは聞いたことがありません。「/ bin/shには理由があります。Bashは、元のBourneShellである/ bin/shを、そのように呼び出されたときにエミュレートします。 "1つには、少し逸脱しますが、このケースは、シェルをインタラクティブに操作するだけでなく、非インタラクティブ、非ログイン(無人を提供する人々にとって重要です。 )またはbackgroundcron最小限のシェル処理を必要とするスクリプト。つまり、バックグラウンド処理では、色付きのプロンプト、コマンド履歴、置換、適切に定義された$ TERM変数など。

さらに、cronに関して、私が通常目にするのは、最小限の検索パスを作成したり、完全に修飾されたプログラムを呼び出したりして、端末に接続されていない出力(つまり、非対話型、非対話型)を処理する方法を知らない人です。 bashスクリプトを使用する場合は、shまたはcron case)にログインします。これは通常、シェルの起動シーケンスを十分に理解していないため、ユーザーがローカルの/etc起動ですでに確立されている規則と矛盾または矛盾する方法で独自の起動ファイルを実装することになります。ファイル。

詳述すると、ローカルの慣例によって行われるセットアップは、その特定のインストールとシェルの/etcファイルに配置されています。典型的なbashスタートアップシーケンスの一部として呼び出されるUNIXインストールの/etcファイルを調べる場合は、で確立された規則を補完する方法で独自のスタートアップを作成する必要があります。それらの/etcスタートアップファイル。

Linux DocumentationProjectは次のように述べています。

/ etc/skel /各新規ユーザーのデフォルトファイルはこのディレクトリに保存されます。新しいユーザーが追加されるたびに、これらのスケルトンファイルがホームディレクトリにコピーされます。平均的なシステムには、.alias、.bash_profile、.bashrc、および.cshrcファイルがあります。その他のファイルはシステム管理者に任されています。

bashマニュアルには、/etc/skelディレクトリに一般的に見られるこれらのファイルについては明示的に記載されていませんが、私が覚えていることから、SunOS、Solaris、RedHat、Ubuntu、HP-UX、umips、およびUltrix後にユーザーのシェル起動ファイルをパターン化するための/etc/skelファイルがあります。 OSXは明らかにそうではありません-私は現在OSX10.9.1を使用しています。残念ながら、OSXは、慣例の観点から設定する方法についてはあまり説明していませんが、OSXはBSD派生物であるため、別のBSD派生物を使用し、独自のbashをパターン化しました。その後の起動シーケンス。OSX10.9.1/etc起動ファイルで使用されているローカル規則に合うように調整します。

並行コメントで言及された重要な点は、OSXの場合、慣例では、すべての新しいターミナルを対話型ログインシェルとして起動することです。これは確かにOSXのデフォルトです。インストールのユーザーが一貫している限り、この規則に問題はありません。 OSX上のターミナルのデフォルトの動作は、ターミナルの設定を次のように変更することで、他のUNIXディストリビューションのシェル起動規則に準拠するように変更できます特に、設定をShells open with:から/usr/bin/login -f -l whmcclos bash -iコマンドを発行します。

enter image description here

これらすべてを背景または紹介として、私の最善のアドバイスについて、その価値について説明します。

私の最善のアドバイス:

UNIXディストリビューションの管理者が配置したファイルを調べます。次の場所が存在する場合は、それらから始めます。一部のファイルはドットで始まるため、ls -aコマンドを使用することを忘れないでください。これらのファイルが起動時にどのように使用されるか、および独自の起動ファイルがそれらとどのように相互作用するかを確認してください。

/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bashrc
/etc/bash.bashrc
/etc/bash_completion

bashのマニュアルで、呼び出しと起動のシーケンスを確認してください。すべて非常によくレイアウトされています。

注意点として、これがOSX 10.9.1インストールでの作業方法です。他のUNIXディストリビューションは異なりますが、以下に示すものは、すべてではないにしてもほとんどのUNIXディストリビューションで機能するはずですが、他のUNIXディストリビューションを使用してください。あなた自身の目的のために以下を調整するためのガイドとしてのコンベンション:

。profile

# ~/.profile: executed by the command interpreter for login shells.

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.  Note, however, that we will have a ~/.bash_profile and it
# will simply source this file as a matter of course.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# From here on out, I basically set up my PATH, LD_LIBRARY_PATH, and anything else I'd like
# global to running programs and how those programs find their libraries.  This is shared by
# `cron`, so we really don't want interactive stuff, here.  Also, I setup my environments
# for brew, macports, and fink here, essentially with setting PATH, and invocation of those
# package initialization file as in:

# Brew and locally compiled stuff:
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH

# The following line puts gnu utilities without the prefix "g" in the path
# i.e. tar/gtar:
export PATH=$PATH:/usr/local/Cellar/coreutils/8.21/libexec/gnubin

# MacPorts shoves stuff in /opt, so to get at that stuff...
export PATH=/opt/local/bin:$PATH
export PATH=/opt/local/sbin:$PATH

# Set up for using Fink, which lives in /sw:
[ -e /sw/bin/init.sh ] && . /sw/bin/init.sh

# My stuff:
export PATH=~/Perl:$PATH
export PATH=~/bin:$PATH
export PATH=.:$PATH

。bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# From here on out, I put in things that are meaningful to interactive shells, like aliases,
# `shopt` invocations, HISTORY control, terminal characteristics, Prompt, etc.

.bash_profile

# ~/.bash_profile: executed by the command interpreter for login shells.

# Because of this file's existence, neither ~/.bash_login nor ~/.profile
# will be sourced.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# Because ~/.profile isn't invoked if this files exists,
# we must source ~/.profile to get its settings:
if [ -r ~/.profile ]; then . ~/.profile; fi

# The following sources ~/.bashrc in the interactive login case,
# because .bashrc isn't sourced for interactive login shells:
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# I'm still trying to wrap my head about what to put here.  A suggestion
# would be to put all the `bash` Prompt coloring sequence functions as
# described on http://brettterpstra.com/2009/11/17/my-new-favorite-bash-Prompt/

これが私の2セントです。私の例では、スタートアップファイルを介して制御パスを示し、特定のサイトの規則によって課せられる可能性のあるものを回避しようとしていることに注意してください。

10
Billy McCloskey

そもそもなぜすべてをbash_profileに入れるのですか?

.profileは元々/ bin/shによって使用されていましたが、.profileを使用すると下位互換性が確保されます。

Macを使用していない限り、すべてがbash_profileに入れられるわけではありません。 bashrcに入れます

すべてをbashrcに入れ、bash_profileソースを使用する方が理にかなっており、Linuxコミュニティとの一貫性が高いのではないでしょうか。

マシンに接続するときにロードされるシェルにシステム情報を入れるのが一般的です(稼働時間、更新が必要なパッケージ、CPU温度など)。 bashrcがbash_profileを取得した場合、新しいシェルを開くたびにそのすべての情報が表示されます。

Unixの場合:

.bash_profileはログインシェルによってロードされます
。bashrcはインタラクティブシェルによってロードされます

すべての新しい端末 (インタラクティブかどうか)のログインシェルをロードするMacを除く

追加リソース

bashrcとbash-profileの違い

環境変数が指定されている場所

4
spuder

[...] bash_profileを優先することが標準である理由がわかりませんか?

それが標準だと誰が言いますか? Bashマニュアル それ自体がこの件についてこう言っています:

したがって、通常、〜/ .bash_profileには次の行が含まれます

if [-f〜/.bashrc];その後。 〜/ .bashrc; fi

ログイン固有の初期化の後(または前)。

2
jjlin