Вот краткий ответ-
Ядро-самая внутренняя часть любой современной операционной системы, напрямую взаимодействующая с аппаратным обеспечением.
Оболочка-оболочка вокруг фактического ядра. Всякий раз, когда мы запускаем команду, мы на самом деле общаемся с оболочкой, которая, в свою очередь, вызывает соответствующие инструкции ядра. Помимо этого, оболочка способна выполнять некоторые другие действия, такие как поиск подходящей программы при наличии команд, сокращение имен некоторых файлов, конвейерные команды и т. д.
Терминал-В эпоху более ранних вычислений компьютеры (, известные как мейнфреймы ), были гигантскими. Таким образом, было легко иметь один процессор и подключать его из разных мест. Терминал — это аппаратное обеспечение с клавиатурой и устройствами вывода, подключенными к мейнфрейму.
Консоль-Терминал особого типа, напрямую подключенный к мейнфрейму для целей администрирования ОС.
tty-Телетайп, используемый для отправки и получения данных на мейнфрейм и обратно. Использовался до появления видеотерминалов. Но условно он по-прежнему называется tty. Даже командаstty
Длинный подробный ответ здесь-Терминал, Консоль, Оболочка, Ядро, Команды -Различные части компьютера
Обычно переменная — это место для хранения значения. Вы присваиваете значение переменной (var="some value"
), а после этого можете вызвать значение с расширением переменной (запись "$var"
эквивалентна записи"some value"
).
Можно создавать переменные, которые делают что-то особенное, когда вы присваиваете им значение или в других обстоятельствах, когда оболочка обращается к переменным. Атрибут переменной — это аннотация, которую оболочка хранит рядом с именем и значением переменной и указывает оболочке применить это особое поведение.
declare -i x
сообщает оболочке, что x
должен содержать только целочисленные значения. Обычно, когда вы присваиваете значение переменной, оболочка берет строку, полученную в результате расширения правой -стороны знака равенства, и сохраняет ее как значение переменной. Но если переменная имеет целочисленный атрибут, оболочка анализирует эту строку как арифметическое выражение и сохраняет результат вычисления этого выражения. Например:
$ x=2+2; echo $x
2+2
$ declare -i x; x=2+2; echo $x
4
$ declare -i x; x=2+hello; echo $x
2
$ declare -i x; x=2+
bash: 2+: syntax error: operand expected (error token is "+")
(Третья строка с x=2+hello
устанавливает для x
значение 2, поскольку hello
— это имя переменной, которое не определено, а неустановленные переменные интерпретируются как 0 по умолчанию.)
declare -l var
объявляет, что var
должен содержать только строчные буквы. Когда оболочка сохраняет значение переменной, она преобразует любую прописную букву в строчную. declare -u var
выполняет преобразование в другом направлении. declare -r var
делает var
только для чтения -, что также является особым поведением присваивания :и приводит к сбою каждого последующего присваивания var
. declare -x var
вызывает экспорт var
в среду. Для этого атрибута особое поведение происходит, когда bash запускает внешнюю команду :внешние команды видят среду, содержащую переменные, которые оболочка экспортирует во время выполнения внешней команды.Изhelp declare
:
Options which set attributes:
-a to make NAMEs indexed arrays (if supported)
-A to make NAMEs associative arrays (if supported)
-i to make NAMEs have the `integer' attribute
-l to convert the value of each NAME to lower case on assignment
-n make NAME a reference to the variable named by its value
-r to make NAMEs readonly
-t to make NAMEs have the `trace' attribute
-u to convert the value of each NAME to upper case on assignment
-x to make NAMEs export
Примечание:declare
также можно использовать для функций.
Каждый из этих атрибутов имеет одно или несколько применений:
-a
-чтобы сделать индексированные массивы NAMEs (, если поддерживается)В этом нет необходимости, поскольку установка параметра в виде массива автоматически объявит его как индексированный массив. Использование этого может сделать ваш код более очевидным и читаемым.
-A
-для создания ассоциативных массивов NAME (, если поддерживается)Насколько мне известно, это совершенно необходимо, так как попытка установить ассоциативный массив без предварительного объявления его как такового приведет к индексированному массиву.
$ assoc=([foo]=bar)
$ declare -p assoc
declare -a assoc=([0]="bar")
$ unset assoc
$ declare -A assoc
$ assoc=([foo]=bar)
$ declare -p assoc
declare -A assoc=([foo]="bar" )
-i
-чтобы ИМЕНА имели целочисленный атрибут `Полезно, если вы хотите, чтобы ваш параметр мог содержать только целые числа. Это также позволяет выполнять арифметическое расширение при присваивании.
$ declare -i a
$ a=foo
$ echo $a
0
$ a=1+1
$ echo $a
2
-l
-для преобразования значения каждого NAME в нижний регистр при назначенииГарантирует, что значения ваших параметров всегда будут в нижнем регистре. Это довольно крутая функция, о которой я не знал и, вероятно, буду использовать в будущем. Это устраняет необходимость расширения сложных параметров или использования отдельной утилиты, такой как tr
$ declare -l foo=Bar
$ echo $foo
bar
-n
-сделать NAME ссылкой на переменную, названную по ее значениюКак косвенная ссылка. Это может исключить использование eval
во многих скриптах.
$ a=foo
$ declare -n b=a
$ echo $b
foo
-r
-сделать ИМЕНА доступными только для чтенияЭто хорошая функция. Это может быть особенно полезно для переменных оболочки/среды, которые вы хотите установить один раз и убедиться, что они не изменились
$ declare -r foo=bar
$ echo $foo
bar
$ foo=baz
-bash: foo: readonly variable
-t
-чтобы ИМЕНА имели атрибут `трассировкиЯ не уверен насчет этого. Я думаю, что это может относиться только к функциям.
-u
-для преобразования значения каждого NAME в верхний регистр при назначенииАналогично -l
, но противоположно
$ declare -u foo=bAr
$ echo $foo
BAR
-x
-для экспорта ИМЕНЕще один способ экспортировать переменные в среду.