Потеря разрешений при добавлении возможностей?

Поскольку большинство случаев, на которые вы ссылаетесь, принадлежат мне, я чувствую, что должен дать ответ здесь, хотя в основном я буду перефразировать @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/ globsubstsh -параметры совместимости ), применяемые к ним.

Например, если заменить элементы на *.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(только при взаимодействии с некоторым ), где его можно рассматривать как другой контекст списка , за исключением того, что только список с одним ожидается элемент (с разбиением и подстановкой для некоторых ).

7
27.07.2018, 11:35
0 ответов

Теги

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