Поскольку большинство случаев, на которые вы ссылаетесь, принадлежат мне, я чувствую, что должен дать ответ здесь, хотя в основном я буду перефразировать @Gilles.
Я использовал контекст списка и скалярный/не -контекст списка(лучше, чем строковый контекст , что может сбивать с толку, если его не понимать как не -list context )десятки раз, начиная с 2004 года вusenet или unix.SE большую часть времени в статьях, обсуждающих влияние оставления расширений без кавычек в Bourne -как снаряды. Я не помню, чтобы кто-то просил разъяснений относительно того, что я имел в виду под этим раньше (Я действительно часто пытаюсь привести несколько примеров таких контекстов для иллюстрации)
Я не использовал его в формальной спецификации каких-либо языков оболочки, это просто текст на английском языке, помогающий объяснить поведение оболочки другим людям.
Это не официальная терминология , хотя очевидно, что она основана на perl
официальной (терминологии )документации. Я не могу сказать, использовали ли другие люди их в контексте оболочек Unix до меня (, хотя очень вероятно, что они это делали ), но, безусловно, с тех пор. Я не претендую на право собственности на это.
list context(по крайней мере, когда я использовал его в контекстах, в которых я его использовал )просто означает контексты, в которых оболочка ожидает любое количество элементов. В то время как скалярный/не -список/строковый контекст будет там, где ожидается только один (или одна строка/скаляр, если хотите ), как в perl
. В большинстве оболочек, подобных Bourne -, эти контексты списков:
echo elements
)for i in elements
array=(elements)
(и вариант с+=
)Некоторые снаряды больше похожи на:
cmd < elements
в zsh
, что делает что-то похожее наcat -- elements | cmd
(как в nl < *.txt
, nl < {foo,bar}.txt
, ноnl < foo.txt < bar.txt
). cmd > elements
(и варианты с >|
>>
...)в zsh
, что делает что-то похожее наcmd | tee -- elements
elements() { code; }
в zsh
определить одну или несколько функций одновременно (или ничего, если элементы разрешаются в пустой список (хотя литерал () { echo x; }
является анонимной функцией )). compound=(foo=(elements) elements)
или matrix=((elements) (elements))
и так далее в ksh93
. В этих контекстах, как правило, подстановочные знаки расширяются, и вам нужно указать свои расширения в кавычках, если вы не хотите, чтобы split+glob (или просто пустое удаление -с помощью zsh
, если вы не включили shwordsplit
/ globsubst
sh -параметры совместимости ), применяемые к ним.
Например, если заменить элементы на *.txt
в приведенных выше примерах, *.txt
будет расширен до списка файлов txt в текущем каталоге.
Если вы ищете эквивалент в спецификации POSIX, ищите контексты, в которых раскрываются универсальные символы. POSIX по крайней мере в одном случае ссылается на это как на контекст, в котором будет выполняться разделение полей(формулировка, которая была фактически изменена после того, как я поднял вопросы с предыдущей формулировкой перед группой Остина). Конечно, эта формулировка не очень полезна для ответа на вопросы о , где выполняется расщепление поля .
скалярные контексты будут другими контекстами.
В
scalar=*.txt
case *.txt in...
[[ -f *.txt ]]
*.txt
не может быть расширен, потому что оболочка ожидает только одну строку .
В качестве предостережения/ограничения эти термины не совсем точно отражают то, что происходит в cmd > *
, cmd > ~(N)pattern
или a=(); b=; c=(a b); d=*; IFS=:; e=a:b; cmd 1> "${a[@]}" 2> $b 3> "${c[@]}" 4> $d 5> $e
в таких оболочках, как bash
/ yash
(, когда они не в режиме POSIX ),ksh88
(с использованием set -A
вместо var=(...)
синтаксиса )илиksh93
(только при взаимодействии с некоторым ), где его можно рассматривать как другой контекст списка , за исключением того, что только список с одним ожидается элемент (с разбиением и подстановкой для некоторых ).