set - シェル変数の表示と変更¶
概要¶
set [(-f | --function) (-l | --local) (-g | --global) (-U | --universal)]
[(-x | --export) (-u | --unexport)]
set (-S | --show) (-L | --long) [NAME ...]
set [-Uflg] [-xu] [--no-event] NAME [VALUE ...]
set [-Uflg] [--no-event] NAME[[INDEX ...]] [VALUE ...]
set (-a | --append) (-p | --prepend) [-Uflg] [--no-event] NAME VALUE ...
set (-e | --erase) [-Uflg] [--no-event] NAME[[INDEX]] ...
set (-q | --query) [-Uflg] [-xu] NAME[[INDEX]] ...
説明¶
set は シェル変数 を操作します。
NAME (変数名)と VALUE (値)の両方が指定された場合、 set はその値を変数 NAME に代入します。fish の変数は リスト であるため、複数の値を保持できます。範囲指定を含む 1 つ以上の変数 INDEX (インデックス)を指定することも可能です(一部のオプションを除く)。
VALUE が指定されない場合、その変数は空のリストに設定されます。
引数なしで set を実行すると、すべてのシェル変数の名前と値をソート順で表示します。スコープ や エクスポート フラグを渡すことで、表示対象をフィルタリングできます。例えば set --local はローカル変数のみを表示します。
--erase を指定すると(必要に応じてスコープフラグを併用)、一致する変数を削除します(スコープ指定がない場合は、該当する名前を持つ最も狭いスコープの変数を削除します)。
--show を指定すると、 set は指定された変数の詳細(どのスコープで、どのような値やオプションで定義されているか)を説明します。
以下のオプションは変数のスコープを制御します。
- -U 、 --universal
ユニバーサル変数を設定します。この変数は、そのマシン上のユーザーのすべての
fishインスタンスですぐに利用可能になり、シェルの再起動後も保持されます。- -f 、 --function
実行中の関数にスコープされた変数を設定します。関数が終了すると削除されます。
- -l 、 --local
現在のブロック内にローカルスコープの変数を設定します。ブロックが終了すると削除されます。ブロックの外側では、 --function と同じ動作になります。
- -g 、 --global
グローバルスコープの変数を設定します。グローバル変数は、同じシェル内で実行されているすべての関数から利用可能です。これらは変更や削除が可能です。
以下のオプションは変数の動作を変更します。
- --export 、 -x
指定されたシェル変数を子プロセスにエクスポートします(これにより「環境変数」となります)。
- --unexport 、 -u
指定されたシェル変数を子プロセスにエクスポート**しない**ようにします。
- --path
指定された変数を パス変数 として扱います。変数はコロン(
:)で分割され、ダブルクォートで囲んで表示(echo "$PATH")したり、エクスポートしたりする際にはコロンで結合されます。- --unpath
変数を パス変数 として扱わないようにします。注意: 名前が "PATH" で終わる変数は、自動的にパス変数として扱われます。
その他のオプション:
- -a 、 --append NAME VALUE ...
変数 NAME の現在の値セットの末尾に VALUES を追加します。--prepend と併用して、先頭と末尾に同時に値を追加することも可能です。変数のスライスに代入する場合には使用できません。
- -p 、 --prepend NAME VALUE ...
変数 NAME の現在の値セットの先頭に VALUES を追加します。--append と併用して、先頭と末尾に同時に値を追加することも可能です。変数のスライスに代入する場合には使用できません。
- -e 、 --erase NAME[INDEX]
指定されたシェル変数を削除します。複数のスコープから一度に削除することも可能です。括弧内の INDEX を指定することで、変数内の特定の項目のみを削除できます。
- -q 、 --query NAME[INDEX]
指定された変数名が定義されているかどうかをテストします。 INDEX が指定されている場合は、そのスロットに項目があるかを確認します。特定のスコープ( --global など)や属性( --export や --path など)が指定された場合は、それらに一致する変数のみをチェックします。何も出力しませんが、終了ステータスには、定義されていなかった変数の数が最大 255 まで設定されます。変数が指定されなかった場合も 255 を返します。
- -n 、 --names
定義されているすべての変数の名前のみを表示し、値は表示しません。名前は必ずソートされた状態で表示されます。
- -S 、 --show
指定された変数に関する情報を表示します。変数名が指定されない場合は、すべての変数がソート順で表示されます。指定された変数が設定されているスコープ、それぞれの値、およびエクスポートされているかどうかが表示されます。このオプションと他のフラグを併用することはできません。
- --no-event
変数の設定または削除時に、変数の変更イベントを発生させません。イベントハンドラには通常、設定されている理由があるため、このオプションの使用には注意が必要です。変数ハンドラ内でその変数自体を書き換える場合などに利用されます。
- -L 、 --long
設定されている変数を表示する際、長い値を省略せずに表示します。
- -h 、 --help
このコマンドの使用に関するヘルプを表示します。
変数に複数の値が設定された場合、その変数は指定された要素を持つリストになります。要素数が 0 の場合、その変数は要素数 0 のリストになります。
PATH[1 3 7] のように、変数名として 1 つ以上のリスト要素を指定した場合、指定された要素のみが変更されます。リスト変数の展開や代入時に負のインデックスを指定した場合、リストの末尾から計算されます。例えば、インデックス -1 はリストの最後の要素を指します。
変数を作成または更新する際のスコープ規則は以下の通りです。
変数は、ユニバーサル、グローバル、関数、またはローカルとして明示的に設定できます。同じ名前であっても、異なるスコープにある変数は変更されません。
変数のスコープが明示的に設定されていない場合でも、 同じ名前の変数が既に定義されている ならば、既存の変数のスコープが使用されます。複数のスコープで定義されている場合は、最も狭いスコープの変数が更新されます。
変数のスコープが明示的に設定されておらず、かつ同じ名前の変数が存在しない場合、その変数は現在実行中の関数に対してローカルになります。これは
-lや--localフラグを使用した場合とは異なることに注意してください。フラグを使用した場合は「現在実行中の最も内側のブロック」に対してローカルになりますが、フラグなしの場合は「関数全体」に対してローカルになります。実行中の関数がない場合、変数はグローバルスコープで設定されます。
変数を作成または更新する際のエクスポート(エクスポート属性)規則は、変数のスコープ規則と同様です。
変数は、エクスポートするかしないかを明示的に設定できます。エクスポートされた変数がスコープ外になると、そのエクスポートは解除されます。
エクスポート設定が明示的に行われていない場合でも、既に定義されている変数の場合は、以前のエクスポート設定が維持されます。
明示的な設定がなく、かつ新規に作成される変数の場合、その変数はエクスポートされません。
照会(query)モードでは、調査対象のスコープを指定できます。また、パス変数である必要があるか、またはエクスポートされている必要があるかも指定可能です。
削除(erase)モードで変数インデックスが指定された場合、リスト変数の指定されたスライスのみが削除されます。
set では、すべてのオプションを他のどの引数よりも前に配置する必要があります。例えば、 set flags -l とすると、変数 flags の値に '-l' が設定されるだけで、変数がローカルになるわけではありません。
終了ステータス¶
代入(assignment)モードでは、 set は終了ステータスを変更せず、コマンド置換などによって設定された既存の status をそのまま引き継ぎます。これにより、 if set output (command) のようにサブコマンドの出力と終了ステータスの両方をキャプチャすることが可能になります。
照会モードにおける終了ステータスは、見つからなかった変数の数になります。
削除モードでは、成功した場合は 0 を返し、コマンドラインが無効な場合、指定した変数が存在しない場合、あるいは指定した変数が 特殊な読み取り専用変数 である場合は 0 以外を返します。
使用例¶
すべてのグローバルかつエクスポートされた変数を表示する:
> set -gx
変数 $foo の値に 'hi' を設定する:
> set foo hi
変数 $foo の末尾に "there" を追加する:
> set -a foo there
スコープから $smurf を削除する:
> set -e smurf
グローバルおよびユニバーサルスコープから $smurf を削除する:
> set -e -Ug smurf
$PATH リストの 4 番目の要素を ~/bin に変更する:
> set PATH[4] ~/bin
type -p が真を返した場合、Python へのパスを出力する:
if set python_path (type -p python)
echo "Python is at $python_path"
end
変数への代入自体は $status を変更しませんが、コマンド置換は変更します:
> echo $status
0
> false
> set foo bar
> echo $status
1
> true
> set foo banana (false)
> echo $status
1
VAR=VALUE command という形式で、他のシェルと同様に 1 つのコマンドに対してのみ変数を設定できます。以下の例では、一時的なホームディレクトリで fish を実行します:
> HOME=(mktemp -d) fish
(これは実質的に以下と同じです):
> begin; set -lx HOME (mktemp -d); fish; end
備考¶
3.0 より前のバージョンの fish では、
set PATH[1] PATH[4] /bin /sbinという構文をサポートしていました。これはset PATH[1 4] /bin /sbinと同様に動作していました。
