perl: предупреждение: установка локали не удалась


“running a function definition” and “running the definition of a function” are not common idioms.  I expect that most people would refer to that simply as “defining a function”.  OK, that phrase might be interpreted to refer to
  1. conceptually specifying the characteristics and interfaces (parameters and other inputs, processing, and outputs) of a function (this is an activity performed by a person, or a group of people)
  2. choosing the implementation of a function; i.e., what commands to use in the function body.  This is an activity performed by a person, or a group of people, possibly using paper, whiteboards, and/or blackboards.
  3. typing the implementation of a function into a text editor or directly into an interactive shell (this, of course, is also an activity performed by a person, or possibly a group of people, or possibly a very intelligent and dexterous cat, dog or monkey)

If you fear confusion with the above, you might be better served by phrases like “reading a function definition” and “processing the definition of a function”.

You say, “A function definition is a command.”  It’s not clear what a claim like that even means — it’s a matter of semantics — but, at the semantic level, it’s debatable.  Section 3.2 of the Bash manual (Shell Commands) lists six kinds of shell commands: Simple Commands, Pipelines, Lists, Compound Commands, Coprocesses, and GNU Parallel.  Function definitions don’t fit well into any of those categories.

Переходим к вашему вопросу и рассматриваем семь шагов / операций,

  1. Чтение ввода, очевидно, должно происходить прежде чемчто-тоеще может произойти. Это, опять же, вопрос семантики - можно сказать, что чтение ввода из файла или другого источника потокового текста является частью «чтения определения функции» или что это является предпосылкой / прелюдией к «обработка определения функции».
  2. Разбиение ввода на слова и операторы явно является частью «обработки определения функции».
    • Разбиение ввода на токены, конечно, предварительное условие / прелюдия к разбору токенов (step3, ниже ).
    • В руководстве сказано: «На этом шаге выполняется расширение псевдонима». и вы показываете в вопросе, что вы знаете, что расширение псевдонима происходит при чтении определения функции.
  3. Анализ токенов. Это должно хотя бы начаться на этапе «обработка определения функции» чтобы оболочка понимала , что она просматривает определение функции и не простая команда. Кроме того, мы можем провести этот простой эксперимент :введите в оболочку одно из следующих действий:

    myfunc1() {                     myfunc2() {
        <               or              ;
    }                               }
    

    Произойдет сбой с «синтаксической ошибкой». прежде чем вы получите возможность ввести }.(>и &дают тот же эффект. )Таким образом, очевидно, что этот шаг является частью обработки определения функции.


  1. Выполнение различных расширений оболочки является частью вызова функции.
    • Вы показываете в вопросе, что знаете, что расширения параметране происходиткогда определение функции читается.
    • Столь же тривиально продемонстрировать, что раскрытие пути / имени файла не происходит при чтении определения функции. В вашем примере измените echo $var(, который должен быть echo "$var",но это другое дело от )до echo *.
      • Если вы посмотрите на определение функции, вы увидите, что он по-прежнему говорит echo *и не был расширен.
      • Изменить каталог(cd)и/или создать файл (s )и/или удалить файл (с )и/или переименовать файл (с ), а затем вызовите (выполните )функцию. Вы увидите, что он выводит текущий список файлов 1 в текущем каталоге, и не отражает содержимое каталога где/когда вы определили функцию.
  2. Выполнение перенаправления является частью вызова функции. Это также тривиально проверить. В вашем примере измените echo $varна echo hello > myfile.
    • Если вы посмотрите на определение функции, вы увидите, что он по-прежнему говорит  > myfile.
    • Проверьте каталог, и вы увидите, что myfileеще не создано ().
  3. Выполнение команды — вам действительно нужно спрашивать?
  4. Ожидание завершения команды невозможно пока команда не будет выполнена (шаг 6 ), поэтому это, очевидно, выполняется только при вызове функции.

Другими словами, именно то, что сказал @ilkkachu .

Единственный исключительный частный случай, о котором я могу думать заключается в том, что шаги 2 и 3 (лексический анализ и синтаксический анализ )повторяются (снова )при выполнении функции, если функция содержит операторы eval— но я считаю, что это выходит за рамки того, что ваш вопрос действительно спрашивает.
____________
1 исключая скрытые (точечные -)файлы, если вы не сказалиshopt -s dotglob

4
06.03.2019, 21:53
0 ответов

Теги

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