OK、source
現在のシェルでスクリプトを実行し、.
詳細を記載したとおりに個別に実行します。「.」と「source」でスクリプトを実行する例えば、具体的には、私の.bashrc
ファイルには以下があります:
[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh
これを次のように置き換えることはできますか:
[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh
それは OS X でも動作しますか - それは「POSIX」の問題ですか?
試してみたところ、上記は Ubuntu でも動作するようです (つまり、実際にはsource
との両方で動作し.
、シェルで必要な機能を提供します)。どちらか一方を選択する必要がありますか、それとも何か見落としているのでしょうか?
ちなみに、OS X では、.bashrc
からソースを取得します.bash_profile
。
答え1
ではbash
、.
と は同義語です。ソース コード ファイルsource
を調べると、同じ内部関数 が使用されていて、次のように表示されます。bash
builtin/source.def
.
source
source_builtin
$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$END
$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.
ただし、source
は POSIX と互換性がないため、スクリプトが POSIX で呼び出される場合は、の代わりに/bin/sh
を使用する必要があります。POSIX はシェルを制限しないため、上記のスクリプトはすべて機能します。.
source
個人的には、.
の代わりに常に を使用しますsource
。(私が書いたスクリプトの多くは で実行されますcron
)。
答え2
これはPOSIXの定義の.dot
:
シェルは現在の環境でファイルからのコマンドを実行します。
ファイルに が含まれていない場合
/<slash>
、シェルは で指定された検索パスを使用して、$PATH
ファイルを含むディレクトリを検索します。ただし、通常のコマンド検索とは異なり、.dot
ユーティリティによって検索されるファイルはない実行可能であること。読み取り可能なファイルが見つからない場合、非対話型シェルは中止します。対話型シェルは診断メッセージを標準エラーに書き込みますが、この状態は構文エラーとはみなされません。
[ -f ./file ] && source ./file
上記を考慮すると、を完全に置き換えたほうがよいでしょう. ./file
。ファイルがない場合、最悪の場合、ログイン時に通知が表示されます。これはおそらく、必要な情報だと思います。
もちろん、テストを保持したい場合は、次のようにすることもできます。
test -f ./file && . $_