Что означает точка с обратной косой чертой как команда?

17

Установленное мной программное обеспечение вставило строку в моем профиле, которая гласит:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

Я знаю, что точка .является синонимом source, так что я подозреваю, что это просто поиск файла, но я никогда \.раньше не видел ; это делает что-то еще?

Отредактируйте, в отношении DV: поиск «точки с обратной косой чертой» приводит к вопросам, касающимся ./вызова исполняемых файлов, и man sourceприводит к тому, что страница man \.не отображается. Я не знаю, что еще попробовать, отсюда и вопрос.

Изменить 2: см. Связанные вопросы

Sheljohn
источник

Ответы:

31

Обратная косая черта вне кавычек означает «интерпретировать следующий символ буквально во время синтаксического анализа». Так .как является обычным символом для синтаксического анализатора, \.анализируется так же, как .и вызывает встроенную функцию (синонимом .которой sourceявляется bash).

Есть один случай, когда это может изменить ситуацию в этом контексте. Если пользователь определил псевдоним, вызванный .ранее .profile, и .profileчитается в оболочке, которая расширяет псевдонимы (что bash делает по умолчанию, только когда он вызывается в интерактивном режиме), тогда .будет запускаться псевдоним, но \.все равно будет запускаться встроенная функция, поскольку оболочка не пытается использовать псевдоним для слов, которые были указаны в любом случае.

Я подозреваю, что это .было изменено, \.потому что пользователь жаловался после того, как он сделал псевдоним для ..

Обратите внимание, \.что вызовет функцию с именем .. Предположительно пользователи, которые пишут функции, более осведомлены, чем пользователи, которые пишут псевдонимы и знают, что переопределение стандартной команды в .profile- плохая идея, если вы собираетесь включать код от третьих сторон. Но если вы хотите обойти и псевдонимы, и функции, вы можете написать command .. Автор этого фрагмента не сделал этого ни потому, что заботился об античных снарядах, в которых не было commandвстроенного, либо, скорее всего, потому, что не знал об этом.

Кстати, определение любого псевдонима в .profileявляется плохой идеей, поскольку .profileэто сценарий инициализации сеанса , а не сценарий инициализации оболочки . Псевдонимы для Bash принадлежат .bashrc.

Жиль "ТАК - прекрати быть злым"
источник
9

Это \.«буквальная точка», то есть просто точка. Это будет принято как стандартная .команда (аналогично sourceв bash).

Стандарт POSIX имеет это, чтобы сказать об этом (мой акцент)

A, <backslash>который не заключен в кавычки, должен сохранять буквальное значение следующего символа , за исключением a <newline>. Если после <newline>следует <backslash>, оболочка должна интерпретировать это как продолжение строки. Символы <backslash>и <newline>должны быть удалены перед разбиением ввода на токены . Поскольку экранированный <newline>символ полностью удаляется из входных данных и не заменяется пробелами, он не может служить разделителем токенов.

Точка может быть псевдонимом:

$ alias .='echo hello'
$ .
hello

что означает , что \.бы избежать использования псевдонима версии .команды, потому что ,

После того, как токен был разграничен, но до применения грамматических правил в грамматике оболочки, результирующее слово, которое идентифицируется как слово имени команды простой команды, должно быть проверено, чтобы определить , является ли оно действительным псевдонимом без кавычек.

Кусалананда
источник
Я искал официальный источник о том, как обратная косая черта в слове интерпретируется как цитирование, и как это предотвращает расширение псевдонима. Спасибо за ссылку!
Sheljohn
1
@Sheljohn Смотрите обновленный ответ.
Кусалананда