понимание значения по умолчанию IFS

. синоним к source команда. Вместо того, чтобы разветвить оболочку sub для выполнения сценария это читает сценарий в текущую среду оболочки. Другими словами, ./script выполнится сценарий в порожденном sub окружают, и делает обработку там. Где . script читает сценарий в Вашу текущую оболочку, где Ваша текущая оболочка обработает команды.

Они делают подобные вещи. С . script Вы читаете и ./script Вы выполняетесь (путем порождения оболочки sub), таким образом, соответствующие полномочия требуются, чтобы делать также.

10
21.03.2014, 00:57
1 ответ
[118381]Переменная IFS используется каждый раз, когда оболочка выполняет задачу с названием [119053]word splitting[119054]. Наиболее часто это используется после расширения параметров (например, [119055]$var[119056]) или подстановки команд (например, [119057]$(some-command)[119058] или устаревших обратных ссылок) в команде. Здесь, если расширение содержит какие-либо символы [119059]IFS[119060], то перед обработкой команды оно разбивается на разные "слова". Фактически это означает, что эти символы разделяют подставленный текст на различные аргументы (включая имя команды, если переменная указана первой).[12422]Таким образом, причиной того, что значением по умолчанию [119061]IFS[119062] являются пробелы, табуляция и новая строка, является то, что это символы пробела, которые обычно ожидаются для разделения слова.[12423]Одним из способов предотвращения разделения слова является использование двойных кавычек вокруг расширения ([119063] "$var"[119064]) - на самом деле, вы сделали это в своем вопросе. Если бы вы этого не сделали, то не было бы вывода от [119065]echo[119066], так как это не имело бы аргументов, а только аргументы разделения символов.[12424]Обратите также внимание, что два места, где разделение слов [119067] не происходит после расширения параметра, это места с присваиванием переменных (например, [119069]var=$othervar[119070] и [119071]var=$(somecommand)[119072] - нормально), и внутри конструкции [119073][[ ]][119074] ([119075][[ $var = $othervar ]]][119076] нормально, но [119077][ $var = $othervar ][119078] следует процитировать). [12425] Наконец, как однажды указал мне мудрец, распространенное заблуждение заключается в том, что предотвращение разделения слов является [119079] единственной [119080] причиной для цитирования переменной. Это не так, цитирование также предотвращает расширение [119081]pathname[119082] или [119083]glob расширение [119084], как это более широко известно. Если переменная содержит символы глобуса типа [119085]*[119086], то они могут быть расширены до имен файлов, когда переменная используется в команде без кавычек. Eg, учтите:[12426]Это отобразит имена файлов в текущей директории.[12427]Как указывает [119087]Стефан ниже[119088], порядок символов в [119089]IFS[119090] важен при расширении [119091] "$*"[119092]. Со страницы [119093]bash[119094] man page:[12428]Для получения более подробной информации о разделении слов, пожалуйста, ознакомьтесь с этим ответом - [119095]https://unix.stackexchange.com/a/118444/48083[12429]
13
27.01.2020, 20:02

Теги

Похожие вопросы