Различия между ключевым словом, зарезервированным словом и встроенным модулем?

вы должны знать, что

CentOS (/sɛnt.ɑːs/, от Community Enterprise Operating System) - это дистрибутив Linux, который пытается предоставить бесплатную вычислительную платформу корпоративного класса, поддерживаемую сообществом, которая нацелена на функциональную совместимость с исходным кодом Red Hat Enterprise Linux (RHEL). [5] [6] В январе 2014 г.

из Википедия

, поэтому этот файл centos-release-upstream объявляет, что он совместим с / производным от Red Hat Enterprise Linux 7.2 (исходный код). Итак, вы будете может использовать rpm, которые совместимы с RHEL 7.2. Версия CentOS и совместимая версия RHEL в этом случае одинаковы, но не обязательно каждый раз одинаковы. Знайте, что CentOS - это версия сообщества, которая предназначена для похоже / работает так же, как и в RHEL Итак, эти два файла показывают разную информацию, а не одно и то же.

8
13.04.2017, 15:37
2 ответа

Ключевое слово, зарезервированное слово и встроенная функция - все это «первое слово» простой команды. Могут быть разделены на две группы: Keyword и Builtin. Эти два понятия исключают друг друга. Слово (токен) может быть либо ключевым словом, либо встроенным, но не обоими сразу.

Почему «первое слово»

Из определения POSIX «Простая команда» (выделено мной):

«Простая команда» - это последовательность необязательных назначений переменных и перенаправлений, в любой последовательности, за которой могут следовать слова и перенаправления, завершаемые управляющим оператором.

2.- Слова, которые не являются назначениями переменных или перенаправлениями, должны быть расширены. Если какие-либо поля остаются после их раскрытия, первое поле должно считаться именем команды , а остальные поля - аргументами для команды.

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

Ключевое слово

Да, ключевое слово - это «зарезервированное слово». Загрузите "man bash" и выполните поиск по ключевому слову. (или просто выполните эту команду: LESS = + / 'keyword' man bash . Первое попадание в поиск говорит следующее:

ключевое слово Shell зарезервированные слова.

Это происходит в

Зарезервированные слова

В POSIX есть определение «Зарезервированных слов» и некоторое описание того, что делают зарезервированные слова .

Но в руководстве по bash есть лучшее рабочее определение.
Найдите "ЗАрезервированные слова" ( LESS = + / 'RESERVED WORDS' man bash ) и найдите это:

ЗАрезервированные слова Зарезервированные слова - это слова которые имеют особое значение для оболочки.
Следующие слова распознаются как зарезервированные без кавычек и либо первое слово простой команды, либо третье слово в регистре, либо для команды:

! case do done elif else esac fi для функции if 
в select then до while {} time [[]] 
 

Builtin

Это не определено в руководстве по bash, но оно довольно проста:

Это команда, которая была реализована внутри оболочки для того, чтобы ее нельзя было избежать (cd, pwd, eval), или для скорости в целом, или для того, чтобы в некоторых случаях избежать противоречивых интерпретаций внешних утилит.

Время - ключевое слово.

Почему время - не встроенная функция, а ключевое слово?

Чтобы разрешить существование команды как второго слова.

Это похоже на то, как if ... then .... fi разрешает включение команд (даже составных команд) после первого ключевого слова if . Или , а или case и т. Д.

12
27.01.2020, 20:11

Q1, Q2

Каково определение ключевого слова?

Является ли понятие "ключевое слово" тем же самым понятием, что и "зарезервированное слово" в Справочном руководстве Bash ?

В основном, особые слова важны для синтаксической структуры. В C есть goto , if , while , enum и так далее; в bash у вас есть if , while (звучит знакомо ...), time и т. д.

И да, они такие же.

Я беру некоторую вольность интерпретировать вопрос, поскольку основные синтаксические элементы оболочки POSIX и bash похожи. Итак, давайте посмотрим на определение в POSIX.1: 2013 Shell Command Language :

2.4 Зарезервированные слова

Зарезервированные слова - это слова, которые имеют особое значение для оболочки; см. Команды оболочки . Следующие слова должны быть признаны зарезервированными словами:

...

Это распознавание происходит только в том случае, если ни один из символов не цитируется и когда слово используется как:

...

См. грамматика в Shell Grammar .

Давайте посмотрим на грамматику POSIX, чтобы увидеть, как Специальные слова - теперь синтаксические токены после лексирования - в действии:

for_clause       : For name linebreak                            do_group
                 | For name linebreak in          sequential_sep do_group
                 | For name linebreak in wordlist sequential_sep do_group
/* ... */
do_group         : Do compound_list Done           /* Apply rule 6 */

Это выглядит знакомо, верно? Обратите внимание, что For , Do и Done на самом деле являются токенами, которые должны отображаться и распознаваться лексером:

%token  If    Then    Else    Elif    Fi    Do    Done
/*      'if'  'then'  'else'  'elif'  'fi'  'do'  'done'   */


%token  Case    Esac    While    Until    For
/*      'case'  'esac'  'while'  'until'  'for'   */

/* and 'In' too -- They made a mistake! */
%token  In    /*      'in'   */

Если вы слышали о ] Yacc или Bison (ну, jison), вот как люди могут использовать грамматику. С помощью этих генераторов синтаксических анализаторов они могут генерировать что-то, что определяет, в каких частях грамматики используется данный поток входных «токенов».

Q3

Ключевое слово обязательно не является командой (или не встроенной командой) ?

В качестве ключевого слова time не является командой (или не встроенной командой)?

Ни одно из ключевых слов не обрабатывается как команды. Но конечно, у вас могут быть команды / функции с одинаковыми именами, например:

# make a command to avoid command-not-found for `FOO=BAR time cmd`
time(){ time "$@"; }

На основании определений ключевого слова и встроенного, почему время не встроенное, а ключевое слово?

Потому что так решили люди чтобы сделать это :

// Licensed under GPLv2, bash:parse.y
// Copyright (C) 1989-2012 Free Software Foundation, Inc.
pipeline_command: pipeline
                | BANG pipeline_command
                | timespec pipeline_command
                | timespec list_terminator
                | BANG list_terminator;
pipeline        : pipeline '|' newline_list pipeline
                | pipeline BAR_AND newline_list pipeline
                | command;
timespec        : TIME | TIME TIMEOPT | TIME TIMEOPT TIMEIGN;

И они получают от этого дополнительную силу (см. следующий вопрос).

Q4

Почему «вы можете сделать, например, time {foo; bar;} », потому что « time является ключевым словом»?

Как часть грамматики, люди, естественно, могут позволить синтаксическому анализатору обрабатывать все и принимать решения, такие как разрешение времени перед составными командами. Если time было реализовано как просто команда, вы получите синтаксическую ошибку для таких конструкций (попробуйте echo {foo; bar;} ), поскольку она действительно анализируется с помощью обычного ' правила.

Также подумайте о [[. Если [ не было ключевым словом, конструкции будут выглядеть как [[($ a == 2) || ($ b! = 3)]] заставит оболочку находить лишние скобки и жаловаться. (Замените [[ на [ и посмотрите »).

П.С. time - это служебная программа вместо ключевого слова в POSIX, хотя последнее по-прежнему считается приемлемым. Вся штука time-a-trunk-of-commands - это расширение ksh и bash.

1
27.01.2020, 20:11

Теги

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