- 書式
- source FILENAME [ARGUMENTS...]
概要
source
コマンドは
指定されたファイルに
書かれたコマンド群を
現在のシェルで評価します。
「評価」とは、
コマンドを実行する
新しいプロセスを立ち上げる
(たとえば fish < FILENAME
)
こととは異なります。
なぜなら、
ファイルに書かれたコマンドは
現在のシェルで評価されるからです
。
つまり、
シェル変数 の変更が
現在のシェルに影響することを
意味します。
訳注:
プロセスを立ち上げた場合は、
シェル変数の変更は
現在のシェルには影響しません。
ファイル名の後に指定された引数は
$argv
変数に設定されます。
$argv
には
読み込まれたファイル名は含みません。
訳注:例は後述します。
以下の場合、標準入力を読み込みます。
- ファイル名が指定されない
- ファイル名が
-
source
の 終了ステータス は
実行された最後のジョブの
終了ステータスになります。
ファイルを開いたり
読み込んでる間に
問題が起きたとき、
source
は異常終了します。
.
(ピリオド)は
source
コマンドの別名です。
.
を source
の
代わりにするのは非推奨で、
将来のバージョンのfishでは
.
は取り除かれる予定です。
実行例
以下の例はユーザ 初期化ファイル を
再読み込みします。
$ source ~/.config/fish/config.fish
$argv
にはsourceに
渡された引数が渡ります。
シェルスクリプトとして
実行した場合と同じです。
$ echo 'echo $argv' > argv.fish $ source argv.fish $ source argv.fish foo foo $ source argv.fish foo bar foo bar $ fish < argv.fish $ fish argv.fish foo bar foo bar
シェルスクリプトとして実行した場合と
source
の決定的な違いが
シェル変数です。
# varに200と設定して表示するスクリプトを作成 $ echo 'set var 200; echo $var' > set.fish # varに10を予め設定しておく $ set var 10; echo $var 10 # コマンドとして実行した場合は元の値に影響しない $ fish set.fish 200 $ echo $var 10 # sourceした場合は元の値が変更される! $ source set.fish 200 $ echo $var 200
警告!
バージョン2.3.0以前のfishにおいて、
引数が指定されないときの $argv
には
読み込まれるファイル名が設定されていました
引数が指定されない場合、
読み込まれるファイル名以外の
引数が設定されました。
この仕様は
ひどく混乱させられた上、
bashやzshといった
他のシェルとは異なりました。
最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。