вы должны знать, что
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 Итак, эти два файла показывают разную информацию, а не одно и то же.
Ключевое слово, зарезервированное слово и встроенная функция - все это «первое слово» простой команды. Могут быть разделены на две группы: 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 [[]]
Это не определено в руководстве по bash, но оно довольно проста:
Это команда, которая была реализована внутри оболочки для того, чтобы ее нельзя было избежать (cd, pwd, eval), или для скорости в целом, или для того, чтобы в некоторых случаях избежать противоречивых интерпретаций внешних утилит.
Почему время - не встроенная функция, а ключевое слово?
Чтобы разрешить существование команды как второго слова.
Это похоже на то, как if ... then .... fi
разрешает включение команд (даже составных команд) после первого ключевого слова if
. Или , а
или case
и т. Д.
Каково определение ключевого слова?
Является ли понятие "ключевое слово" тем же самым понятием, что и "зарезервированное слово" в Справочном руководстве 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), вот как люди могут использовать грамматику. С помощью этих генераторов синтаксических анализаторов они могут генерировать что-то, что определяет, в каких частях грамматики используется данный поток входных «токенов».
Ключевое слово обязательно не является командой (или не встроенной командой) ?
В качестве ключевого слова
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;
И они получают от этого дополнительную силу (см. следующий вопрос).
Почему «вы можете сделать, например,
time {foo; bar;}
», потому что «time
является ключевым словом»?
Как часть грамматики, люди, естественно, могут позволить синтаксическому анализатору обрабатывать все и принимать решения, такие как разрешение времени
перед составными командами. Если time
было реализовано как просто команда, вы получите синтаксическую ошибку для таких конструкций (попробуйте echo {foo; bar;}
), поскольку она действительно анализируется с помощью обычного ' правила.
Также подумайте о [[
. Если [
не было ключевым словом, конструкции будут выглядеть как [[($ a == 2) || ($ b! = 3)]]
заставит оболочку находить лишние скобки и жаловаться. (Замените [[
на [
и посмотрите »).
П.С. time
- это служебная программа вместо ключевого слова в POSIX, хотя последнее по-прежнему считается приемлемым. Вся штука time-a-trunk-of-commands - это расширение ksh и bash.