〜/ .bash_profileが機能しないのはなぜですか?


35

Linux Mintを使用しています。私のログインシェル(cat /etc/passwd | grep myUserName)はbashです。

グラフィカルデスクトップ環境を起動し、そこからターミナルエミュレータを実行すると、.bash_profileソースされていないことがわかります(その環境でexportedされている環境変数は設定されていません)。しかし、テキストコンソール(ctrl+ alt+ F1)からログインするかbash -l、ターミナルエミュレータから手動で実行すると、.bash_profile正常に動作します。

.bash_profileXが起動し、すべてのexport'ed varsがXから実行されているターミナルで利用可能になったときにソースを取得する必要があると思う場合、私は間違っていますか?

PSすべてを配置して.bashrcそこから調達するの.bash_profileは良い考えではありません(https://stackoverflow.com/questions/902946/):環境関連のものは1回だけ調達する必要があります。

回答:


39

~/.bash_profileログインシェルの場合、ファイルはbashによって読み取られます。これは、テキストモードでログインしたときに得られるものです。

Xでログインすると、起動スクリプトがによって実行され/bin/shます。Ubuntuとミントでは、/bin/shあるダッシュではなく、bashの。Dashとbashはどちらも同じコア機能を備えていますが、高速で小さくするためにダッシュはこれらのコア機能に固執しますが、bashはより多くのリソースを必要とする代わりに多くの機能を追加します。余分な機能を必要としないスクリプトにはダッシュを使用し、インタラクティブな使用にはbashを使用するのが一般的です(ただし、zsh には多くの優れた機能があります)。

ディスプレイマネージャ(ユーザー名とパスワードを入力プログラム)とデスクトップ環境のほとんどの組み合わせが読ん~/.profileでログインスクリプトから/etc/X11/Xsession/usr/bin/lightdm-session/etc/gdm/Xsessionまたは該当する方。したがって、環境変数の定義をに入れてください~/.profile。ダッシュがサポートする構文のみを使用してください。

それで、どこに何を置くべきですか?

  • 適切な.bash_profileロード.profile、および.bashrcシェルがインタラクティブな場合にロードします。

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • .profile、環境変数の定義、およびなどの他のセッション設定を配置しますulimit

  • .bashrc、エイリアス、関数、補完、キーバインド(にない.inputrc)などのbashインタラクティブ設定を配置します。

ログインシェルと非ログインシェルの違いも参照してくださいおよび.bashrcの代替


1
単一の回答から多くのことを学びました:)
mtk

16

.bash_profilebashのスタートアップ構成スクリプトです。Xをsourceに強制する標準は存在しません.bash_profile

あなたが考えているのはむしろ.profileです。もともとは、bourneシェル(sh)のスタートアップ構成ファイルでした。現在、多くのディストリビューションでは、デスクトップ環境がsourceに設定されています.profile。これも標準ではありませんが、慣例のようです。

Debian .profileはグラフィカルログイン(2013年時点のwikiページ)でソースを使用していましたが、現在はそうではありません(2016年時点のwikiページ)。

.xprofileグラフィカルログイン時のArchソース(2013年時点のWikiページ)。

Ubuntuは.profile2013年時点のwikiページ)を使用することを推奨していませんでした(2016年時点のwikiページ)。


あなたの他の質問について:〜/ .bash_profileが機能しないのはなぜですか?それが予想される動作です。

動作は、要するに次のとおりです。

  • bashは対話型ログインシェルとして開始しました:読み取り ~/.profile
  • bashは対話型の非ログインシェルとして開始しました:読み取り ~/.bashrc

詳細については、askubuntuの同様の質問に対する私の回答を参照してくださいhttps ://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319#132319


1
これのいくつかは正しいですが、「常に読む~/.bashrc」は悪いアドバイスです:インタラクティブなシェルからのみ読む.bashrcべきです。ここで中心的な問題を見逃しました。Xでログインするとき、bashのログインインスタンスがありません(明らかにAntonioKを含むほとんどのディスプレイマネージャー/デスクトップ環境の組み合わせ)。
ジル 'SO-悪であるのをやめる'

ご意見ありがとうございます。あなたの苦情を解決するのに十分に私の答えを更新したことを願っています。「常に読む.bashrc」という私のアドバイスに関して、私は常にインタラクティブなシェルを意味していました。その部分を明確にしました。もう誤解を招かないことを願っています。
レスマナ

2
Ubuntuは特に使用を推奨しません.profilelink」wikiは一度(不条理に)推奨しません。それは修正されました。(/etc/profileシステム全体への割り当てはお勧めできません/etc/profile.d。スクリプトをに追加することを.profileお勧めします。)ユーザーごとの環境変数を設定する推奨方法の1つとして、ユーザーごとのファイルが表示されます。特定のユーザー(システム全体ではなく)は〜/ .pam_environmentおよび〜/ .profileです。 "
エリアケイガン14年

Debianに関するリンクされたページは、Debianがグラフィカルログインを読み取らない~/.profileため、~/.xsessionrc代わりに使用することを指定してます。
カロラ

気づいてくれてありがとう。wikiページが更新されました。回答時点のバージョンにリンクしました。
レスマナ

2

あなたの質問では、受け入れられた答えがに規定されている場合ソースにしないことを推奨するとしてhttps://stackoverflow.com/questions/902946/を参照します

  • PATH設定を.profileファイルに入れます(他のシェルを使用することがあるため)
  • Bashのエイリアスと関数を.bashrcファイルに入れます
  • 次に、この[編集:切り取りコードコメント]を使用します。

    .bash_profile

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

.profileLinux Mintでは、すべてを入れてもうまくいきませんでした。使用.bashrcはうまくいきました。


2

〜/ .profileファイルをリロード/ソースしようとすると、いくつかの問題が発生します。[これはUbuntu linuxを指します-場合によっては、コマンドの詳細が異なります]

  1. これをターミナルまたはスクリプトで直接実行していますか?
  2. スクリプトでこれをどのように実行しますか?

広告。1)

これをターミナルで直接実行すると、サブシェルは作成されません。したがって、次の2つのコマンドを使用できます。

source ~/.bash_profile

または

. ~/.bash_profile

どちらの場合でも、これにより.profileファイルの内容で環境が更新されます。

広告2)次のいずれかを呼び出して、bashスクリプトを開始できます。

sh myscript.sh 

または

. myscript.sh

最初のケースでは、これにより、システムの環境変数に影響を与えないサブシェルが作成され、サブシェルプロセスにのみ表示されます。サブシェルコマンドの終了後、エクスポートなどは一切適用されません。これはよくある間違いであり、多くの開発者が多くの時間を失います。

スクリプトに適用された変更をグローバル環境に有効にするには、スクリプトを実行する必要があります

.myscript.sh

コマンド。

スクリプトがサブシェルで実行されないようにするために、この関数を使用できます。(再び、Ubuntuシェルの例です)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

これにより、よくある誤解のいくつかが解消されることを願っています!:Dグッドラック!


0

簡単な解決策は、端末をログイン端末にすることです。デフォルトプロファイルの「タイルとコマンド」の下のGnomeターミナルの場合、「ログインシェルとしてコマンドを実行」ボックスをチェックできます。この記事では、ログインシェルとそうでないログインシェルの違いについて説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.