シェルの環境

INPUT · スライド

値をしまう入れ物(変数)

01 / 06

あなたはもう変数を使っている

この章は「打った文字が、コマンドに届く前に何をされているか」の話だよ。まずは変数から始めよう。

実はもう使っているんだ。

~ $ cd ~~ $ echo $HOME/home/manabiya

$HOME は「あなたの部屋の場所」が入っている入れ物だよ。~ も同じものを指しているね。

他にもこんなものが最初から入っているよ。

名前中身
HOME自分の部屋
USER自分の名前
PATHコマンドを探す場所
PWDいまいる場所
SHELL使っているシェル

大事なのは、$HOME を置きかえているのはコマンドではないということだよ。

echo $HOME  ↓ シェルが先に書きかえるecho /home/manabiya  ↓ これが echo に渡る

echo$HOME という文字を見たことすらないんだ。シェルが通訳しているんだよ。この視点が章10のすべてだよ。

02 / 06

自分で作る

入れ物は自分でも作れるよ。書き方はこれだけだよ。

~ $ MYNAME=taro~ $ echo $MYNAMEtaro

置くときは $ を付けず、使うときは $ を付けるんだ。ここが少し変わっているね。

MYNAME=taro     置く($ なし)echo $MYNAME    使う($ あり)

そして空白を入れてはいけないよ。

~ $ MYNAME = taro-sh: MYNAME: not found

なぜエラーになるか分かるかな。シェルは空白で区切って読むので、こう見えているんだ。

MYNAME  という名前のコマンドを、= と taro を引数にして実行

そんなコマンドは無いので not found だね。空白は区切りという決まりが、ここでも効いているんだよ。

中身に空白を入れたいときは引用符で囲むよ。

MESSAGE="ohayou gozaimasu"

引用符の細かい話は、この章の後ろでたっぷりやるからね。

03 / 06

子には渡らない

ここが今日いちばん大事なところだよ。

~ $ MYNAME=taro~ $ sh -c 'echo [$MYNAME]'[]

空っぽだったね。sh -c新しいシェルを1つ起動して、そこで打つという意味だよ。つまり子どものプロセスだね。

変数は、ふつう子には渡らないんだ。

あなたのシェル  MYNAME=taro(ここだけの覚え書き)  └─ 子のシェル       MYNAME は無い

渡したいときは export を付けるよ。

~ $ export MYNAME=taro~ $ sh -c 'echo $MYNAME'taro

この2つには名前が付いているよ。

呼び方何が違うか
シェル変数そのシェルの中だけ
環境変数(export 済み)起動する子にも渡る

なぜ分けてあるかというと、渡す必要のないものまで渡すと重くなるからだよ。作業用の一時的な入れ物は、外に漏らさないほうがきれいだね。

そして忘れないでね。export しても親には戻らないよ。渡るのは下方向だけなんだ。

04 / 06

env で今の環境を見る

いま何が export されているかは env で見られるよ。

~ $ envHOME=/home/manabiyaPATH=/bin:/sbin:/usr/bin:/usr/sbinUSER=manabiya...

名前=値 の形で並ぶので、grep で絞れるね。

env | grep PATH

env にはもう1つの使い方があるよ。その1回だけ変数を渡すんだ。

~ $ env B=jiro sh -c 'echo $B'jiro~ $ echo [$B][]

子には届いたのに、自分のところには残っていないでしょう。汚さずに1回だけ渡すやり方だね。

消したいときは unset だよ。

unset MYNAME

そして、無いときの既定値を書く形も覚えておくと便利だよ。

~ $ echo ${NASI:-kawari}kawari

${名前:-代わり} は「入っていればそれ、無ければ代わり」という意味だよ。スクリプトを書くときによく使うんだ。設定されていなくても止まらない、という書き方だね。

05 / 06

広がるのは1回だけ

変数を別の変数に入れるとどうなるか、見ておこう。

~ $ X=1~ $ Y="X wa $X"~ $ echo $YX wa 1~ $ X=2~ $ echo $YX wa 1        ← 変わらない!

Y は「$X を見に行く仕掛け」ではなく、そのときの中身をコピーしたただの文字なんだ。

Y="X wa $X" と書いた瞬間に  ↓ シェルが $X を 1 に置きかえるY は "X wa 1" という文字になる

これが展開は書いた瞬間に1回だけ起きるという決まりだよ。表計算ソフトの数式とは違うので、気をつけてね。

変わり続けるものもあるよ。

~ $ cd /tmp/tmp $ echo $PWD/tmp

PWDcd するたびにシェルが書き直しているんだ。あなたが代入したのではなく、シェルが面倒を見ている変数だね。

変数誰が入れる
PWD OLDPWDシェルが自動で
?$?直前のコマンドの結果で自動で
自分の変数あなたが

$? は章11で主役になるよ。「成功なら 0」というあれだね。

06 / 06

さあ、打ってみよう

この回で使う形をまとめておくね。

echo $HOME              入れ物の中身を見るMYNAME=taro             作る(空白を入れない)export MYNAME=taro      子にも渡す形で作るexport MYNAME           あとから渡す形にするunset MYNAME            消すenv                     渡る形のものを一覧env B=jiro コマンド      その1回だけ渡すsh -c 'echo $MYNAME'    子で確かめる${NASI:-kawari}         無いときの代わり

確かめ方のコツを1つ。渡っているかどうかは、子で見るしかないよ。

echo $MYNAME            自分のところ(渡っていなくても見える)sh -c 'echo $MYNAME'    子のところ(渡っていないと空)

この2つを並べて打つのが、この回の練習の形だよ。

sh -c の中はシングルクォートで囲むのを忘れないでね。ダブルクォートだと、自分のシェルが先に $MYNAME を置きかえてしまって、子で見たことにならないんだ。

sh -c 'echo $MYNAME'    子が $MYNAME を見る(正しい確かめ方)sh -c "echo $MYNAME"    自分が置きかえた文字を子が echo するだけ

この違いも、この章の後ろでちゃんとやるよ。いまは「シングルで囲む」と覚えておいてね。