Можно ли использовать «.» для запуска файлов вместо исходного кода в .bashrc в Ubuntu и OS X?

Можно ли использовать «.» для запуска файлов вместо исходного кода в .bashrc в Ubuntu и OS X?

Хорошо, 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 && . $_

Связанный контент