書式
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といった
他のシェルとは異なりました。

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