それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashの似てて紛らわしいもの '.' と 'source' について

似てて紛らわしいものシリーズ  . / source について

bash の記号で初心者泣かせの、似てて紛らわしかったり、使い分けがわからなかったり、読み方を間違えてパニックになる記号について書く。

. / source について

.source は、どちらも同じ意味と効果を持ちます。

. / source は外部のファイルを読み込んで現在実行中の箇所に展開します。

他の言語でいうところの、requireimport になります。

大きな違い

  • .POSIX に定義されていてどこでも使えます。
  • sourcebash 特有のコマンドです。*1

そのため 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, 

*3

おまえ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 タイトルがわかりにくいので修正。

*1: もちろん zsh などでも使えますが

*2: 自分で起動するときでも bash --posix で起動すると POSIX互換モードになります。

*3:patch level 57 だからShell Shockは大丈夫ですね。

*4: わたしは、bash でほとんど書いてしまうのでsourceを多用しますが。意見には個人差が有ります

*5:意見には個人差が有ります