読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】変数に入れたのにスクリプトから見えん。シェル変数と環境変数、export・env・set・unset【LPICレベル1】

19レスカテゴリ:Linux
1: 名無しさん

V=1 って定義してから bash -c 'echo $V' したら空っぽやった
同じ端末やのに何で見えへんの?

2: 名無しさん

前提のおさらい。ダブルクォートの中では $ が効いて変数が展開され、シングルクォートの中では展開されない

3: 名無しさん

>>1
V=1 で作ったのはシェル変数で、そのシェルの中だけのもの。新しく起動したプログラム(子プロセス)には渡らない

4: 名無しさん

>>3
子プロセスにも渡すには export して環境変数にする

5: 名無しさん

>>4
手元で試した結果
V=1; bash -c 'echo "[$V]"' → []
export V; bash -c 'echo "[$V]"' → [1]

6: 名無しさん

>>5
ここの bash -c の中身はシングルクォートで囲んでるから、外のシェルでは展開されず、子の bash が展開してるんやな

7: 名無しさん

>>4
export V=1 と、定義と export を1行でもできる

8: 名無しさん

>>1
1つのコマンドにだけ渡したいときは?

9: 名無しさん

>>8
コマンドの前に 変数=値 を書く。そのコマンドの環境にだけ入って、シェルには残らない
V2=2 bash -c 'echo "[$V2]"' → [2]
そのあと echo "[$V2]" → []

10: 名無しさん

>>1
一覧を見るコマンドは?

11: 名無しさん

>>10
env(や printenv)は環境変数だけ、set はシェル変数も含めた全部(関数も出る)。export を引数なしで打つと export 済みの一覧

12: 名無しさん

>>11
env はほかにも、env 変数=値 コマンド で環境を変えてコマンドを動かせる。env -i で空の環境から

13: 名無しさん

>>1
消すのは?

14: 名無しさん

>>13
unset V。$ は付けない。unset -f 関数名 で関数を消す

15: 名無しさん

>>14
unset $V って書くと V の中身の名前の変数を消しに行くんか。気をつけよ

16: 名無しさん

>>3
よく見る環境変数は PATH(コマンドを探す場所)、HOME、USER、LANG、PS1(プロンプト)あたり。PS1 は export されてないことが多い

17: 名無しさん

>>4
ログアウトしたら消える?

18: 名無しさん

>>17
消える。毎回設定したいなら ~/.bashrc や ~/.bash_profile に書く。どのファイルがいつ読まれるかは 105.1 の範囲

19: 名無しさん

>>4
作っただけの変数はそのシェルだけ、export すると子プロセスにも、か。env と set の違いもこれで分かった

管理人のひとこと