似てて紛らわしいものシリーズ . / source について
bash の記号で初心者泣かせの、似てて紛らわしかったり、使い分けがわからなかったり、読み方を間違えてパニックになる記号について書く。
. / source について
. と source は、どちらも同じ意味と効果を持ちます。
. / source は外部のファイルを読み込んで現在実行中の箇所に展開します。
他の言語でいうところの、require や import になります。
大きな違い
そのため source コマンドは/bin/sh では使えません。と一般的に説明されてています。
sh では sourceは動きません。。。?
そのshはほんとうにshですか?
例外もあります。 たとえば、手元のmac OSX の場合。sh は bash です。。。ああ。bash互換モードだ。*2
おまえbashだったのか。
/bin/sh --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation,
おまえdash だったのか
takuya@:~$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 2016-06-13 22:10 /bin/sh -> dash
違いに注意しないと大変。
osx の sh は bash なので source が存在します。
debian / ubuntu で使われてる debian shell のdash の場合は POSIX性を重要視してるのでsource は存在ません。
いろいろなところで動かす場合は . を使ったほうが無難なのかもしれません。
mac の sh の場合
takuya@~$ /bin/sh sh-3.2$ source source: usage: source filename [arguments] sh-3.2$
debian の sh の場合
takuya@:~$ /bin/sh $ source sh: 1: source: not found
どっち使えばいいの?
bashを前提にしているし、読みやすいし source でいいと思います。*4
POSIX互換を意識する方々は . でいいでしょうし、source 使う場合でもシェルに次のように書いておけば、どこでも大丈夫でしょう。
type source 2>&1 >/dev/null ||alias source=.
記号を減らして検索性や可読性を向上させる視点において source の方がいいように思います。*5
. の覚え方
個人的なことですが、. はカレントシェルにファイルを読み込むと覚えています。カレントといえば . ですからね。
takuya@~$ . ~/.bashrc
参考資料
http://askubuntu.com/questions/25488/what-is-the-difference-between-source-and-in-bash
修正
2017-01-09 段落校正
2021-06-04 タイトルがわかりにくいので修正。