Я запутался из-за роли, которую играет разделение слов zsh
. Я не сталкивался с этой концепцией при программировании на C, Python или MATLAB, и это вызвало у меня интерес к тому, почему расщепление слов кажется чем-то специфичным для программирования оболочки.
Я читал о разделении слов на этом и других сайтах ранее, но не нашел четкого объяснения концепции. В Википедии есть определение разделения слов, но, похоже, нет ссылок на то, как оно применяется к оболочкам Unix.
Вот пример моей путаницы в zsh
:
В FAQ по Z Shell я прочитал следующее:
3.1: Почему ,
$var
когдаvar="foo bar"
не делать то , что я могу рассчитывать?В большинстве производных от Bourne-shell переменные, состоящие из нескольких слов, например
var="foo bar"
, разделяются на слова, когда передаются команде или используются вfor foo in $var
цикле. По умолчанию у zsh такого поведения нет: переменная остается нетронутой. (Это не ошибка! См. Ниже.) ОпцияSH_WORD_SPLIT
существует для обеспечения совместимости.
Однако в Руководстве по Z Shell я прочитал следующее:
SH_WORD_SPLIT (-y) <K> <S>
Вызывает разделение полей при раскрытии параметров без кавычек. Обратите внимание, что эта опция не имеет ничего общего с разделением слов. (См. Расширение параметров.)
Почему говорится, что SH_WORD_SPLIT
это не имеет ничего общего с разделением слов? Разве слово не разделяет именно то, что это все?
"word1 word2 word3"
в списки / массивы формы"word1" "word2" "word3"
? Я также обновил ОП с конкретным источником путаницы в Zsh.$IFS
символы. Следовательно, «разделение полей» является лучшим названием. Но «расщепление слов» часто используется для этой концепции в литературе по оболочкам. Документация по Zsh не соответствует словам.rc
(оболочка plan9, также перенесенная в Unix), чтобы получить еще лучший дизайн, чем zsh, когда речь идет о переменных и массивах.Разделение слов не является специфическим для оболочки.
Большинство программ, которые должны анализировать ввод текста, используют некоторую форму разделения слов в качестве первого шага. Это делается перед тем, как идентифицировать по этим «словам», числам, операторам, строкам, токенам и любым другим подобным объектам, которые им необходимо обработать.
Что характерно для оболочек, так это то, что они должны правильно составлять список аргументов команд, называемых (C argc / argv, python sys.argv), включая передачу аргументов со встроенными пробелами, пустыми аргументами, пользовательскими разделителями и так далее. Многие оболочки используют переменную IFS, чтобы обеспечить некоторую гибкость.
источник
В этом конкретном случае Zsh разделение слов определяется несколько иначе, чем разделение полей.
Учтите
prog a b c
, что он будет передаваться в трех аргументах независимо от того, как вы установитеIFS
. Это разделение слов .Если вы это сделаете
A="a b c"; prog $A
, он передаст три аргумента, еслиIFS
включает пробел или один аргумент в противном случае. Это разделение полей .Определения здесь неуловимы. Документ Zsh пытается сказать, что, даже если вы отключите эту опцию,
prog a b c
он все равно получит отдельные аргументы (это то, что люди всегда ожидают).источник