- 書式
- set [SCOPE_OPTIONS]
- 書式
- set [OPTIONS] VARIABLE_NAME VALUES...
- 書式
- set [OPTIONS] VARIABLE_NAME[INDICES]... VALUES...
- 書式
- set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...
- 書式
- set ( -e | --erase ) [SCOPE_OPTIONS] VARIABLE_NAME
- 書式
- set ( -e | --erase ) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]...
概要
set
コマンドは
シェル変数 を扱います。
set
コマンドが無引数で呼ばれたとき、
すべてのシェル変数名と値を表示します。
スコープやexport関係の
オプションが設定されたとき、
条件にマッチする変数のみが表示されます。
変数 VARIABLE_NAME
と
値 VALUES
が与えられれば、
set
コマンドは変数に
値を設定します。
set
コマンドは
オプション以外の引数の前に
オプションを置く必要があります。
たとえば、
set flags -l
は
変数 flags
に -l
という値を設定し、
ローカル変数を定義しません。
オプション
スコープをコントロールするオプション
-l
/--local
- 現在のブロックに対して
(強制的に)ローカル変数にする。
ローカル変数以外の
同名の変数がある場合であっても。 -g
/--global
- グローバル変数にする。
グローバルではない変数は
end
に対応するブロックが終了するまで隠される。 -U
/--universal
- ユニバーサル変数 にする。
現在のコンピュータで動いている
現ユーザの全fishセッションで
変数は共有される。
シェルを再起動しても保持される。 -x
/--export
- 子プロセスにもexport(伝播)される。
つまり「環境変数」となる。 -u
/--unexport
- 子プロセスにexport されない ようにする。
その他の変数
-e
/--erase
- 変数を削除する。
配列変数のインデックスが指定されたとき、
その要素のみが削除される。 -q
/--query
- 変数が定義されているかをテストする。
何も出力しないが、
終了ステータス は未定義の変数の数になる。
スコープのオプションも同時に指定できる。 -n
/--names
- 変数名のみを表示し、値は表示しない。
-L
/--long
- 長い値を省略表示しないようにする。
配列変数
変数に複数個の値を
設定しようとしたとき、
その変数は指定された要素の
配列になります。
変数の要素数が0であるときは
空配列になります。
変数名が1つ以上の配列の要素であるとき
(たとえば PATH[1 3 7]
)、
指定された要素のみが
変更されます。
配列のインデックスが指定されたとき、
複数の引数が追加のインデックスとして
使われることがあります
(たとえば set PATH[1] PATH[4] /bin /sbin
)。
配列変数を拡張・設定するときに
インデックスに負の数を指定すると、
インデックスは配列の末尾から数えられます。
たとえば、インデックス -1
は
配列の末尾です。
スコープのルール
変数を作成・変更するときの
スコープのルールは以下の通りです。
-
変数を明示的にユニバーサル変数、
グローバル変数、
ローカル変数に
設定したときは、その設定が優先される。
別なスコープに
同名の変数が存在するとき、
その変数は変更されない。
- 変数のスコープが明示されないが、
すでに定義されているときは、
変数のスコープは変わらない。 -
変数のスコープが明示されず、
未定義である場合は、
現在実行中の 関数にローカル になる。
これは
-l
/--local
スイッチとは
異なることに注意!
これらのスイッチを使った場合、
その変数は実行中の最も内側の
ブロックにローカルになる。
使わない場合は、
関数にローカルになる。
関数実行中でない場合は
グローバルになる。
exportのルール
作成時・変更時のexportのルールは
スコープのルールと同一です。
- 変数がexportされるかどうかを
明示的に設定したときは、
その設定が優先される。 - 変数がexportされるかどうかを
明示的に設定していないが、
すでに定義されているときは、
定義時のルールに従う。 - 変数がexportされるかどうかを
明示的に設定していなくて、
かつ未定義であるときは、
exportされない。
終了ステータス
変数設定に失敗したとき、
set
コマンドは異常終了
(終了ステータス1以上)
します。
変数設定が行われたとき、
終了ステータスは変更されません。
このことは、
サブコマンドの出力と
終了ステータスを
同時に取得できることを意味します。
たとえば、
if set output (command)
と if コマンドの条件式として
set
コマンドを記述できます。
-q
/ --query
を指定したとき、
終了ステータスは
未定義変数の個数になります。
-e
/ --erase
を指定したとき、
成功したときは正常終了
(終了ステータス0)
します。
以下の場合で異常終了します。
- コマンドラインが不正
- 変数が書き込み禁止
- 変数が存在しないとき
実行例
# グローバル環境変数を表示 set -xg # 変数fooにhiを設定する set foo hi Sets the value of the variable $foo to be 'hi'. # 変数smurfを削除する set -e smurf Removes the variable $smurf # PATHの4番目を ~/bin に変更する set PATH[4] ~/bin Changes the fourth element of the $PATH array to ~/bin # which pythonが正常終了したとき、 # python_pathにpythonのパスが設定され、 # Python is at /usr/bin/python などと表示される if set python_path (which python) echo 'Python is at $python_path' end Outputs the path to Python if which returns true.
配列変数についての補足実例です。
# 配列変数aryにfoo bar bazの3要素を設定 $ set ary foo bar baz $ echo $ary foo bar baz # 2番目の要素をBARに設定する $ set ary[2] BAR $ echo $ary foo BAR baz # 2番目と3番目の要素それぞれXとYにする $ set ary[2] ary[3] X Y $ echo $ary foo X Y # aryを空配列にする $ set ary $ echo $ary # 空配列は「実在」する $ set ary $ set -q ary; echo $status 0 $ set -q not_found; echo $status 1
最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。