
Ubuntu日本語フォーラム

ログインしていません。
第一
XYZ=/home/example
export PATH=$PATH:${XYZ}
第二
export PATH=/home/example
第三
export PATH=${PATH}:/home/example
同じ意味だと思われる、気になった三個の種類がありました。
私は第二が一番すっきりしていて、良いなと思ったのですが。
慣れの問題かもしれません。
それぞれなにか「違い」や「意味」があるのでしょうか?
オフライン
user3999 様へ。
1 番目と 3 番目の意味は同じですが、
2 番目のパスは全然違いますよ。
PATH、XYZ は変数と捉えてください。
3 番目の利点は、1 行にパスがまとめられているので
すっきりすることでしょうか。
1 番目の利点は、XYZ のパスが安定していない場合、
つまり、これからも変更の可能性がある場合に便利だと思います。
例えば、3 番目に、沢山のパスを設定(: で複数のパスを区切る)すると、
その中の変更されやすいパスを *探して*、変更となるので、
そういう意味では、別の変数にしておくのが便利だと思います。
2 番目は、タイポだと思うのですが、
システムで設定した PATH を上書きして、/home/example だけに
しているので、システムで設定されたパスが全て無効になります。
従って、この行が .bashrc の最後にあると、端末で一般的に使えるコマンドも
コマンド名だけでは使えなくなります(フルパスを入力すれば使えますが…)。
オフライン
解答有難うございます。
第一と第三の利点は理解できました。
第二についてですが
第二の書式で書いたものが動いていたので(勘違いかもしれませんが)
気になりましたので以下に質問というか確認を追加です。
まず前提である第二の例が良くなかったかもしれません
訂正: 第二
export PATH=/home/obama/example
>この行が .bashrc の最後にあると
第二の書式が「最後の行ではない場合」は問題が発生しないのでしょうか?
最後の行にあると、今まで変数PATHに蓄積されたものが上書きされ消えてしまうという理解はできたのですが。
途中であれば「 : 」と同じ扱いになり変数に蓄積されるという理解で正しいのかと思ったための質問です。
いずれにせよ利点も使えず、最後に書くという間違いが起きる可能性があるので、第二は不適切かもしれません。
オフライン
user3999 様へ。
user3999 による投稿:
>この行が .bashrc の最後にあると
第二の書式が「最後の行ではない場合」は問題が発生しないのでしょうか?
システムでデフォルトの環境変数が定義される前に書けば問題ないという話です。
ただ、システムのデフォルトの環境変数は、.bashrc が
読み込まれる前に定義されているようなので、第二の方法はよくありません。
環境変数 PATH は #2 でも述べた通り、変数であり、文字列変数を扱っていると思ってください。
「:」は区切り文字であり、何らかの特殊な動作をする記号というわけではありません。
第一、第三の定義上はそれぞれ違いますが、結果としては、
「PATH = 今回の定義の前に定義されている環境変数」なので、
実際に特殊なシステム設定をしていないのであれば、PATH の内容は
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
になります。従って、
export PATH=$PATH:/home/example
は、これまでの環境変数に /home/example を追加しているので、
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/example
となります。
第二の方法では、これまでの環境変数である PATH はどこにも定義されておらず、
環境変数が /home/example だけになるので、これまでコマンドだけで通ってきたものは
使えなくなります。
user3999 による投稿:
第二の書式で書いたものが動いていたので(勘違いかもしれませんが)
気になりましたので以下に質問というか確認を追加です。
.bashrc を書き換えた後、以下のコマンドを実行していますか?
$ source ~/.bashrc
あるいは、端末を再起動していますか?
このコマンドを実行しない場合、.bashrc の設定内容は反映されません。
なので、その場合、以前の環境での実行となるため、特に問題がないように感じられます。
オフライン
返信有り難うございます。
#2で仰られたとおり、export PATHの記述は存在せず、typoでした。
正確には、私が仕組みを理解していなかったための表現です。(今もよく理解していないですが)
そもそも第二の表現はしては駄目で
第四
export XYZ=/home/example --------------------A
export 変数名(XYZ)=値(/home/example)
第一
XYZ=/home/example ----------------------------B
export PATH=$PATH:${XYZ} --------------------C
変数名(XYZ)=値(/home/example)
export 変数名(PATH)=値(/usr/local/sbin:/home/example)
これで正しいかと思いますが。今度はAとBの区別がつかなくなってしまいました。
Aで「環境変数としてXYZが宣言」され、次はBでexport無しなので「一時的な変数としてXYZが宣言」され、
そのBは次のCで処理されるとして読み込まれるんでしょうか。
つまりもうこれはこういうものだというルールなのですかね。
まあそもそも変数の衝突が起こることはまれな気もしますが。
何度も細かい質問申し訳ないです。
オフライン
user3999 様へ。
export は、簡単に言うと、変数をグローバル変数にするという指定です。
つまり、サブシェルからでも参照できます。
A と B の違いはそれだけです。
A と B は、どちらかが定義されれば良いです。
XYZ を別のシェルで参照しないのであれば、export を付ける必要はありません。
グローバル変数の利点、危険性は、理解していますよね?
A で定義しようが、B で定義しようが、
C で、A、あるいは B の内容が代入された状態で定義されるので、
A、あるいは B で定義した内容も、環境変数 PATH に登録されます。
オフライン