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

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

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

.bash_profileグラフィックスデスクトップ環境を起動してターミナルエミュレータを実行した後、ソースがないことがわかります(編集された環境変数がexport設定されていない場所)。ただし、ctrlテキストコンソール(++)からログインするか、ターミナルエミュレータで手動で実行するとalt正常に動作します。F1bash -l.bash_profile

.bash_profileXが起動したときにインポートする必要があり、すべてのexport変数が端末で利用可能でXで実行されるべきだと思うのは間違っていますか?

PSはすべてを入れて.bashrcソースを提供します。.bash_profile これは良い考えではありません。:環境用品は一度だけ購入してください。

答え1

bashがログインシェルの場合、~/.bash_profilebashはこのファイルを読み取ります。テキストモードでログインすると表示される内容です。

Xからログインすると、起動スクリプトは/bin/sh.UbuntuとMintで構成さ/bin/shれます。スプリント、強く打つ代わりに。 Dashとbashは両方とも同じコア機能を持っていますが、dashは高速で小さいためコア機能に固執しますが、bashはより多くのリソースを必要とする代わりに多くの機能を追加します。一般的に、ダッシュはアドインを必要としないスクリプトに使用され、bashは対話型の使用に使用されます(もちろん扱いにくい より良い機能がたくさんあります。)。

ディスプレイマネージャ(ユーザー名とパスワードを入力するプログラム)とデスクトップ環境のほとんどの組み合わせは~/.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などのbashインタラクション設定を配置します。.inputrc

また、見ることができますログインシェルと非ログインシェルの違いは何ですか?そして.bashrcの代替

答え2

.bash_profileBashの起動設定スクリプトです。.bash_profileXのソースを規定する標準はありません。

あなたが考えるのは.profile。もともとBourne Shell(sh)の起動設定ファイルでした。今日、多くのディストリビューションはデスクトップ環境をソースコードに設定します.profile。これも標準ではありませんが慣例のようです。

Debian はソースコードを使って.profileグラフィカルログインでソースコードを取得します (2013年現在のWikiページ)今ではない(2016年現在のWikiページ)。

アーチソース.xprofile2013年現在の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

答え3

/source ~/.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 頑張って!

答え4

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

関連情報