The objective of this project is for you to create a simple shell. Your little bash or zsh. You will learn a lot about processes and file descriptors.
Подумайте над следующим примером:
$ a=linuxcareer.com
$ echo $a
linuxcareer.com
$ bash
$ echo $a
$
Строка 1: создается новая переменная с именем "a", содержащая строку "linuxcareer.com".
Строка 2: мы используем команду echo, чтобы вывести содержимое переменной "a".
Строка 3: мы создаем дочерний экземпляр оболочки bash.
Строка 4: переменная "a" теперь не определена.
Из приведенного выше примера можно видеть, что любой дочерний процесс, ответвляющийся от родительского процесса, по умолчанию не наследует переменные родителя. Для этого и нужна команда export. Что произойдет, если мы используем команду export в вышеприведенном примере?
$ a=linuxcareer.com
$ echo $a
linuxcareer.com
$ export a
$ bash
$ echo $a
linuxcareer.com
$
Теперь в строке 3 мы использовали команду export, чтобы экспортировать переменную "a" в созданный новый дочерний процесс. В результате переменная "a" все еще содержит строку "linuxcareer.com", даже после создания нового экземпляра оболочки bash. Здесь важно отметить, что для успешного экспорта "a" необходимо, чтобы процесс, в который экспортируется переменная, ответвлялся от того родительского процесса, из которого экспортируется эта переменная. Связь между дочерним и родительским процессами описана ниже.
Сбрасывает значение переменной
Single quotes won't interpolate anything, but double quotes will. For example: variables, backticks, certain \ escapes, etc.
Но очень важно в двойных кавычках поставить $, чтобы выполнилась команда))
Example:
$ echo "$(echo "upg")"
upg
$ echo "(echo "upg")"
(echo upg)
$ echo '$(echo "upg")'
$(echo "upg")
Некоторые переменные окружения и оболочки очень полезны и используются довольно часто. Ниже представлены некоторые распространенные переменные окружения, которые вам, скорее всего, придется использовать:
SHELL: описывает оболочку, где будет выполняться интерпретация любых команд, которые вы вводите. В большинстве случаев по умолчанию будет использоваться bash, но другие значения можно установить, если вы предпочитаете использовать другие варианты.
TERM: указывает тип терминала, который будет использоваться при запуске оболочки. Различные аппаратные терминалы могут имитироваться согласно различным операционным требованиям. Скорее всего вам не придется думать об этом.
USER: текущий пользователь, для которого выполнен вход.
PWD: текущий рабочий каталог.
OLDPWD: предыдущий рабочий каталог. Эта информация сохраняется оболочкой, чтобы выполнять переход к предыдущему каталогу с помощью команды cd -.
LS_COLORS: цветовые коды, которые используются для опционального добавления цветного вывода для команды ls. Эта команда используется для выделения различных типов файлов и предоставления пользователю большего количества информации при беглом просмотре.
MAIL: путь к почтовому ящику текущего пользователя.
PATH: список каталогов, которые система будет проверять при поиске команд. Когда пользователь вводит команду, система будет проверять каталоги в указанном здесь порядке при поиске исполняемого файла.
LANG: текущий язык и настройки локализации, включая кодирование символов.
HOME: домашний каталог текущего пользователя.
_: последняя предыдущая выполненная команда.
Clear the history list by deleting all of the entries, in the same manner as the History library's clear_history() function. This differs from clear_history because it frees private data Readline saves in the history list.
Прототип: stdio.h Описание: Эта функция не определена стандартом ANSI С. Функция fstat() заполняет структуру, на которую указывает statbuf, информацией о файле, связанном с дескриптором файла handle. Информация о содержимом stat может быть найдена в файле sys\stat.h.
При успешном заполнении структуры типа stat возвращается 0. При ошибке возвращается —1 и errno устанавливается в EBADF.