Linux Mintを使用しています。ログインシェル(cat /etc/passwd | grep myUserName
)はbashです。
グラフィカルデスクトップ環境を起動してターミナルエミュレーターを実行した後、.bash_profile
が読み込まれていないことがわかります(export
edである環境変数は設定されていません)。しかし、テキストコンソールからログインした場合(ctrl+alt+F1)または、ターミナルエミュレータからbash -l
を手動で実行すると、.bash_profile
が正常に機能します。
Xの起動時に.bash_profile
をソースにし、すべてのexport
'ed varsをXから実行しているターミナルで使用できるようにすると思いますか?
追伸すべてを.bashrc
に配置して.bash_profile
から調達することはお勧めできません( https://stackoverflow.com/questions/902946/ ):環境のソースは1回だけ調達する必要があります。
ログインシェルの場合、ファイル~/.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は.profile
( 2013年の時点でのwikiページ )の使用を推奨していませんでしたが、現在は推奨されていません( 2016の時点でのWikiページ )。
他の質問について:私の〜/ .bash_profileが機能しないのはなぜですか?これは予想される動作です。
つまり、動作は次のとおりです。
~/.profile
を読み取ります~/.bashrc
を読み取ります詳細については、askubuntuの同様の質問に対する私の回答を参照してください: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-Shell-doesnt -read-bashrc/132319#132319
〜/ .profileファイルをリロード/ソースしようとすると、いくつかの問題が発生します。 [これはUbuntu linuxを指します-場合によっては、コマンドの詳細が異なる場合があります]
広告。 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グッドラック!
あなたの質問では、 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
の使用は問題なく動作しました。
簡単な解決策は、端末をログイン端末にすることです。デフォルトプロファイルの[タイルとコマンド]の下にあるGnome端末の場合は、[ログインシェルとしてコマンドを実行]チェックボックスをオンにできます。 これ の記事では、ログインシェルとそうでないものの違いについて説明しています。