書式
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
配列の末尾です。

スコープのルール

変数を作成・変更するときの
スコープのルールは以下の通りです。

  1. 変数を明示的にユニバーサル変数、
    グローバル変数、
    ローカル変数に
    設定したときは、その設定が優先される。

    別なスコープに
    同名の変数が存在するとき、
    その変数は変更されない。

  2. 変数のスコープが明示されないが、
    すでに定義されているときは、
    変数のスコープは変わらない。
  3. 変数のスコープが明示されず、
    未定義である場合は、
    現在実行中の 関数にローカル になる。

    これは -l / --local スイッチとは
    異なることに注意!

    これらのスイッチを使った場合、
    その変数は実行中の最も内側の
    ブロックにローカルになる。

    使わない場合は、
    関数にローカルになる。

    関数実行中でない場合は
    グローバルになる。

exportのルール

作成時・変更時のexportのルールは
スコープのルールと同一です。

  1. 変数がexportされるかどうかを
    明示的に設定したときは、
    その設定が優先される。
  2. 変数がexportされるかどうかを
    明示的に設定していないが、
    すでに定義されているときは、
    定義時のルールに従う。
  3. 変数が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

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。