Чи правильно використовувати "." запускати файли замість джерела - в .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
Якщо це снаряди на основі "ш", я б використовував "." для глобальної сумісності, і якщо ви використовуєте оболонки на основі csh, я б використовував джерело.
mdpc

2
Де у пов’язаному дописі ви бачите, що " sourceпрацює сценарій у поточній оболонці та .окремо"? Вони обидва запускають його у поточній оболонці; інакше не було б сенсу
Майкл Мрозек

Відповіді:


11

Це визначення POSIX в з .dot:

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

Якщо файл не містить а /<slash>, оболонка повинна використовувати шлях пошуку, вказаний в, $PATHщоб знайти каталог, що містить файл. На відміну від звичайного пошуку команд, файл, який шукається .dot утилітою, не повинен бути виконаним . Якщо не знайдено читабельного файлу, неінтерактивна оболонка повинна перерватись; інтерактивна оболонка повинна написати діагностичне повідомлення до стандартної помилки, але ця умова не вважатиметься синтаксичною помилкою.

Враховуючи вищесказане, ви можете просто замінити своє [ -f ./file ] && source ./fileна . ./fileзовсім. Якщо файл там не найгірше, що станеться, ви отримаєте повідомлення при вході в систему - це, мабуть, інформація, яку ви хочете мати.

Звичайно, якщо ви бажаєте зберегти тест, який ви можете зробити:

test -f ./file && . $_

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


За рівних умов використовуйте "джерело" замість ". з однієї причини: спробуйте здійснити пошук / grep для "". вирази у великому сценарії. Це кошмар.
абонет

Хоча ця відповідь пояснює, чому використання .зазвичай "краще", ніж використання source, як говорить @abonet, sourceпошук набагато простіше. Оскільки періоди є пунктуаційними у багатьох мовах, оку легко просто пропустити їх. Ось чому я вважаю за краще використовувати source.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.