似てて紛らわしいものシリーズ . / 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 タイトルがわかりにくいので修正。