結論
先に結論だけ言っておくとsource file1 file2
はできない。file1, file2をsource
したいなら下記のようにする。
find ~/local_scripts |while read script; do source $script done # もしくはfor文でもいい for script $(find ~/local_scripts); do source $script done
いずれにせよsource
コマンドは1つずつ実行する必要がある。
source
コマンドの第二引数以降はスクリプトの引数($1
や$2
)としてみなされてしまうからだ。
source
コマンドのmanにもそう書いてある。というかsource
はただのコマンド実行だからそりゃそうだよねっていう。
source filename [arguments]
ここからポエム
.zshrc
には載せたくないローカル用のスクリプトがある。
そんな時は.zshrc.local
のようなスクリプトを用意して、そこにローカル用の関数を書いていくってこと結構あると思う。
.zshrc.local
#!/usr/bin/env bash echo_local() { echo 'This is local' }
上記のような.zshrc.local
を用意したら.zshrc
の末尾にsource ~/.zshrc.local
と書けば、echo_local()
がコマンドとして使えるようになる。
$ echo_local
This is local
が、関数が多くなるにつれてファイル分割したくなってくる。そんなときに罠にかかった話。
sourceコマンドで読み込めばいいじゃんと思うじゃん
例えば下記のように関数をファイル分割した場合
ディレクトリ構造
~/local_scripts |-- echo_local.sh `-- echo_local2.sh
echo_local.sh
#!/usr/bin/env bash echo_local() { echo 'This is local' }
echo_local2.sh
#!/usr/bin/env bash echo_local2() { echo 'This is local 2' }
.zshrc
に下記を記載すればいけると思った。
source ~/local_scripts/*
が、これはできない。展開するとsource ~/echo_local.sh ~/echo_local2.sh
となるからだ。
終わり
あとは最初の結論にも書いたとおり。
読み込みたいファイルが引数として解釈されてしまうから、1つずつsource
しましょうねって話。