2017/12/10(日) -シェル変数


# Linux環境変数ファイルが読み込まれる順番

1. /etc/profile
このファイルに全ユーザ共通の環境変数設定を記載しています。
読み込みは、ユーザーがログインした時(ログインシェル)です。
(ターミナルログイン、bash --login、ssh、su - コマンドなど)


2. ~/.bash_profile 
各ユーザのホームディレクトリ(~/)にあります。
このファイルにユーザ毎の環境変数設定を記載しています。
読み込みは、ユーザーがログインした時(ログインシェル)です。
(ターミナルログイン、bash --login、ssh、su - コマンドなど)
1. の次に読み込み、
1. で設定した環境変数と同名の環境変数がある場合は上書きします。


3. ~/.bashrc
各ユーザのホームディレクトリ(~/)にあります。
読み込みは、インタラクティブシェルを起動する時です。
(bash、su コマンドなど)
また、基本的には 2. の ~/.bash_profile に、 3. の ~/.bashrc を呼ぶ記載があります。
結果として、この ~/.bashrc に定義しておくことで、
ログインシェルでもインタラクティブシェルでも同じ環境変数を定義することが可能です。


4. /etc/bashrc
このファイルに全ユーザ共通の関数とエイリアス環境変数設定を記載しています。
ここでデフォルトのプロンプトを決める「PS1」の設定などをしています。
(bash、su コマンドなど)
また、基本的には 3. の ~/.bashrc に、 4. の /etc/bashrc を呼ぶ記載があります。
結果として、この /etc/bashrc に定義しておくことでも、3. ~/.bashrc と同様、
ログインシェルでもインタラクティブシェルでも同じ環境変数を定義することが可能です。


1. 2. で環境変数を定義、
3. 4. で関数やプロンプト表示を定義するのが本来は一般的な使い方です。

 

 

 

 


# シェル変数と環境変数の違い

シェル変数・・・・現在のシェル(同一プロセス)内でのみ有効な変数(exportしない変数)
環境変数・・・・・現在のシェルから呼び出すシェル(子プロセス)にも引き継がれる変数(exportする変数)

test.sh での実行例。
# testval.sh の中身
echo $testval

# シェル変数の例

testval="test"
echo $testval

=> test

sh test.sh

=> 何も出力ない

# 環境変数の例:
testval="test"
export testval
echo $testval

=> test

sh test.sh

=> test

 

 

 

 


# .(source)コマンドと、shコマンド(またはフルパス実行)の違い

どちらのコマンドも、引数に指定されたファイルを実行しますが、
違いは下記です。

shコマンド(またはフルパス実行)・・・・別シェル(別プロセス)で起動
.(source)コマンド・・・・・・・・・・現在のシェル(同一プロセス)で起動


# shコマンド(またはフルパス実行)

testval2="test2"
echo $testval2

=> test2

sh test.sh

=> 何も出力ない


# .(source)コマンド

testval2="test2"
echo $testval2

=> test2

. test.sh

=> test2

 

 

 


上記を全て踏まえると現在のシェル上に環境変数を定義し、
shコマンドで呼び出すシェルからも参照できるようにするには、
~/.bashrc または/etc/bashrcに、
下記のように記載します。

# 案1
test=testprog
export test

# 案2
. ~/envsetting

# ~/envsettingの中身
test=testprog
export test


# おまけ:シェバン(#!/bin/bash)の意味
=> インタプリタの指定を行います。