web-dev-qa-db-ja.com

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

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

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

Xの起動時に.bash_profileをソースにし、すべてのexport 'ed varsをXから実行しているターミナルで使用できるようにすると思いますか?

追伸すべてを.bashrcに配置して.bash_profileから調達することはお勧めできません( https://stackoverflow.com/questions/902946/ ):環境のソースは1回だけ調達する必要があります。

36
AntonioK

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

Xでログインすると、スタートアップスクリプトは/bin/shによって実行されます。 UbuntuとMintでは、/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の代替 も参照してください。

.bash_profileは、bashのスタートアップ構成スクリプトです。ソース.bash_profileにXを強制する標準はありません。

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

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

Archはグラフィカルログイン時に.xprofileをソースします( 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

16
lesmana

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

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

広告。 1)

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

source ~/.bash_profile

または

. ~/.bash_profile

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

広告2)を呼び出すことで、bashスクリプトを開始できます。

sh myscript.sh 

または

. myscript.sh

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

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

.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グッドラック!

3
twboc

あなたの質問では、 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
    

Linux Mintでは、すべてを.profileに入れてもうまくいきませんでした。 .bashrcの使用は問題なく動作しました。

2
serv-inc

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

0