Хорошо, 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
, вам следует использовать .
вместо source
. Поскольку POSIX не ограничивает оболочку, все ваши приведенные выше скрипты будут работать.
Лично я всегда использую .
вместо source
. (Многие написанные мной скрипты работают под cron
).
решение2
ЭтоОпределение POSIXиз .dot
:
Оболочка должна выполнять команды из файла в текущей среде.
Если файл не содержит
/<slash>
, оболочка будет использовать путь поиска, указанный$PATH
для поиска каталога, содержащего файл. Однако, в отличие от обычного поиска команд, файл, искомый утилитой,.dot
долженнетбыть исполняемым. Если не найдено ни одного читаемого файла, неинтерактивная оболочка прервется; интерактивная оболочка запишет диагностическое сообщение в стандартный поток ошибок, но это состояние не будет считаться синтаксической ошибкой.
Учитывая вышесказанное, вы могли бы просто заменить свой [ -f ./file ] && source ./file
на . ./file
вообще. Если файла там нет, худшее, что может случиться, это то, что вы получите уведомление при входе в систему — а это, вероятно, та информация, которую вы хотели бы иметь, я думаю.
Конечно, если вы предпочитаете сохранить тест, вы можете сделать следующее:
test -f ./file && . $_