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

11

ОК, поэтому 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и ., то есть, они дают мне нужную функциональность в оболочке). Должен ли я выбрать один над другим, или я что-то упустил?

FWIW, на OS X, я исходный код .bashrcот моего .bash_profile.

Майкл Даррант
источник
1
Если бы это были оболочки на основе 'sh', я бы использовал '.' для глобальной совместимости и если вы используете оболочки на основе 'csh', я бы использовал исходный код.
mdpc
2
Где в связанном посте вы видите, что « sourceзапускает скрипт в текущей оболочке и .отдельно»? Они оба запускают его в текущей оболочке; иначе не было бы никакого смысла
Михаил Мрозек

Ответы:

11

Это определение POSIX в из .dot:

Оболочка должна выполнять команды из файла в текущей среде.

Если файл не содержит a /<slash>, оболочка должна использовать путь поиска, указанный с помощью, $PATHчтобы найти каталог, содержащий файл. Однако, в отличие от обычного поиска команд, файл, который ищет .dot утилита, не обязательно должен быть исполняемым. Если читаемый файл не найден, неинтерактивная оболочка должна прерваться; интерактивная оболочка должна записать диагностическое сообщение в стандартную ошибку, но это условие не должно считаться синтаксической ошибкой.

Учитывая вышесказанное, вы можете также просто заменить ваши [ -f ./file ] && source ./fileс . ./fileполностью. Если файла там нет, самое худшее, что может случиться, это то, что вы получите уведомление при входе в систему - вероятно, именно такую ​​информацию вы хотели бы получить, я думаю.

Конечно, если вы предпочитаете оставить тест, вы можете сделать:

test -f ./file && . $_
mikeserv
источник
2
О, люди знают $_, мне это нравится. :)
Андреас Визе
@AndreasWiese - каждый должен - это один из 7 специальных параметров, определенных POSIX.
mikeserv
+1 Я закончил тем, что использовал test -f /.file && . $_подход, показанный здесь
Майкл Даррант
6
@mikeserv Нет, $_POSIX не стандартизируется. В 8 специальных параметров являются $@, $*, $#, $$, $!, $?, $-и $0. $_это явно опущен . Ваш неправильный комментарий вызвал вопрос .
Жиль "ТАК - перестань быть злым"
19

В 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).

cuonglm
источник
При прочих равных условиях используйте «источник» вместо «.» по одной причине: попробуйте найти / grep для "." выражения в большом сценарии. Это кошмар.
Абонет
Хотя этот ответ объясняет, почему использование, .как правило, «лучше», чем использование source, как говорит @abonet, sourceпоиск гораздо проще. Поскольку точки являются пунктуацией во многих языках, глазу просто пропустить их. Вот почему я предпочитаю использовать source.
Джо