Руководство про переменные в среде Linux. Переменные окружения Linux, переменные оболочки Ubuntu переменные окружения

О бъекты, которые задаются именами и содержат данные, используемые по крайней мере одним, обычно несколькими приложениями, называются переменными среды. Проще говоря, переменная окружения является не чем иным, как переменной, которая имеет имя и значение.

Значениями переменной среды может быть редактор по умолчанию, который будет использоваться, например, расположение всех файлов, которые могут быть выполнены в системе или локальные настройки для системы. Для начинающих это немного сложно, но переменная окружения – отличный способ совместного использования настроек конфигурации между несколькими приложениями и процессами.

В пакете Coreutils размещены программы env и printenv. Чтобы перечислить все переменные среды, которые в настоящее время имеют значение, просто введите:

$ printenv

В оболочке bash существуют два типа переменных среды:

  • Глобальные переменные
  • Местные переменные

Глобальные переменные окружения

Из сеанса оболочки отображаются глобальные переменные окружения, и любые дочерние процессы, которые генерирует оболочка.

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

По умолчанию система Linux устанавливает определенные глобальные переменные среды при запуске сеанса bash. Переменные системной среды каждый раз используют все заглавные буквы, чтобы отличать их от обычных переменных среды пользователя.

Локальные переменные среды

Поскольку их имя указывает, что переменные локальной среды могут отображаться только в локальном процессе, в котором они определены. Не смешивайте, хотя и о переменных локальной среды, они одинаково важны как глобальные переменные среды. Фактически, система Linux также по умолчанию будет определять стандартные локальные переменные среды для вас. Это становится сложно, когда вы пытаетесь увидеть список переменных локальной среды. К сожалению, для нас нет команды, которая будет отображать только локальные переменные среды. Существует команда, которая отображает все переменные среды, заданные для определенного процесса. Обратите внимание, что это также включает глобальные переменные окружения.

Установка переменных среды

Вы можете создавать свои собственные переменные среды прямо из оболочки bash. В следующем разделе мы покажем вам, как создавать собственные переменные среды и ссылаться на них из вашей интерактивной программы оболочки или оболочки.

Настройка переменных локальной среды

После запуска оболочки bash (или появления сценария оболочки) вам разрешено создавать локальные переменные, которые видны внутри вашего shell-процесса. Вы можете присвоить переменную окружения переменной string или numeric с помощью знака равенства, которому присваивается значение переменной:

$ andreyex_test=testing $ echo $andreyex_test testing $

Поздравляем, вы только что создали свою первую переменную. Просто помните, что в любое время вам нужно ссылаться на значение переменной среды andreyex_test, просто ссылайтесь на нее по имени $ andreyex_test.

Если вам нужно назначить строку значений, содержащих пробелы, вам нужно будет использовать один кавычек, чтобы указать начало и конец строки:

$ andreyex_test=testing a long string -bash: a: command not found $ andreyex_test="testing a long string" $ echo $andreyex_test testing a long string

Если оставить его без одиночных кавычек, оболочка bash предполагает, что следующий символ – это еще одна команда для обработки.

Обратите внимание, что для переменной локального окружения, которую мы определили, мы использовали строчные буквы, переменные системной среды, которые мы видели до сих пор, использовали все прописные буквы.

В оболочке bash это стандартное соглашение. Если вы настраиваете новые переменные среды, это не требуется, но рекомендуется использовать строчные буквы. Это помогает дифференцировать ваши личные переменные среды из результатов переменных системной среды.

ПРИМЕЧАНИЕ . Очень важно, чтобы между именем переменной среды, знаком равенства и значением не было пробелов. Если вы помещаете какие-либо пробелы в присваивание, оболочка bash интерпретирует значение как отдельную команду:

$ andreyex_test2 = test -bash: andreyex_test2: command not found $

Установленная локальная переменная среды в вашем процессе оболочки будет доступна для использования в любом месте вашего shell-процесса. Но если вы создаете другую оболочку, она недоступна в дочерней оболочке:

$ bash $ echo $andreyex_test $ exit exit $ echo $andreyex_test testing a long string $

В этом случае мы начали дочернюю оболочку. Как вы можете заметить, переменная среды andreyex_test недоступна в дочерней оболочке (она содержит пустое значение). После того как мы оставили дочернюю оболочку и вернулись к исходной оболочке, переменная локальной среды все еще была доступна.

Аналогично, если вы установите локальную переменную окружения в дочернем процессе после того, как вы покинете дочерний процесс, переменная локальной среды перестает быть доступной:

$ bash $ andreyex_test=testing $ echo $andreyex_test testing $ exit exit $ echo $andreyex_test $

Переменная среды andreyex_test, установленная в дочерней оболочке, не существует, когда мы возвращаемся к родительской оболочке.

Настройка глобальных переменных окружения

Глобальные переменные окружения видны из всех процессов дочернего процесса, созданных процессом, который устанавливает глобальную переменную среды. Метод, используемый для создания глобальной переменной окружения, заключается в создании локальной переменной среды, а затем ее экспорта в глобальную среду.

Это выполняется с помощью команды export:

$ echo $andreyex_test testing a long string $ export andreyex_test $ bash $ echo $andreyex_test testing a long string $

После того, как мы используем экспорт команды в локальной переменной среды andreyex_test, мы начали новый процесс оболочки и просмотрели значение переменной среды andreyex_test. На этот раз команда export сделала глобальную переменную среды глобальной, поэтому она сохранила свою ценность.

Обратите внимание, что при запуске экспорта команды в локальной переменной среды вы не используете знак доллара для ссылки на имя переменной.

Удаление переменных среды

Очевидно, что если вы можете создать новую переменную среды, было бы разумно, что вы также можете удалить существующую переменную среды. Это можно сделать, используя команду unset:

$ echo $andreyex_test testing $ unset andreyex_test $ echo $andreyex_test $

Если вы ссылаетесь на переменную среды в команде unset, имейте в виду не использовать знак доллара.

При работе с глобальными переменными среды все становится немного сложнее. Если вы находитесь в дочернем процессе и отключите глобальную переменную окружения, она применима только к дочернему процессу. Глобальная переменная среды остается доступной в родительском процессе:

$ andreyex_test=testing $ export andreyex_test $ bash $ echo $andreyex_test testing $ unset andreyex_test $ echo $andreyex_test $ exit exit $ echo $andreyex_test testing $

В этом примере мы устанавливаем локальную переменную среды, называемую andreyex_test, затем экспортируем ее, чтобы сделать ее глобальной переменной окружения. Затем мы начали процесс дочерней оболочки и были проверены, чтобы убедиться, что глобальная переменная среды andreyex_test все еще доступна. Затем, еще находясь в дочерней оболочке, мы использовали команду unset для удаления глобальной переменной среды andreyex_test, а затем вышли из дочерней оболочки. Теперь вернемся к исходной родительской оболочке, мы проверили значение переменной среды andreyex_test, и оно все еще действует.

Переменные среды Shell по умолчанию

Существуют конкретные переменные среды, которые bash shell использует для определения системной среды. Вы всегда можете подсчитать эти переменные, которые будут использоваться в вашей системе Linux. Поскольку оболочка bash является производной исходной оболочки Unix Bourne, она также включает переменные среды, первоначально определенные в этой оболочке.

Следующие примеры показывают, что переменные среды, предоставляемые оболочкой bash, совместимы с исходной оболочкой Unix Bourne.

До сих пор наиболее ценной переменной среды в этом списке является переменная среды PATH.

Когда вы вводите команду в командной оболочке оболочки (интерфейс командной строки), оболочка должна искать систему, чтобы найти программу. Каталоги, которые он ищет в поисках команд, определяются переменной среды PATH. В системе Linux переменная среды PATH должна выглядеть примерно так:

$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin $

В этом случае показано, что существует восемь каталогов, в которых оболочка ищет команды. Каждый каталог разделяется двоеточием, и в конце переменной PATH нет и конца списка каталогов. Вы всегда можете добавить дополнительные каталоги в PATH, добавив новый каталог и добавив еще один двоеточие. PATH также демонстрирует запрос, в котором он ищет заказы.

В дополнение к стандартным переменным среды Bourne, оболочка bash также предоставляет несколько переменных, как показано:

Переменные Bash Shell Bourne:

CDPATH: список каталогов, разделенных двоеточиями, используемых в качестве пути поиска для команды cd.
HOME: домашний каталог текущего пользователя.
IFS: список символов, которые разделяют поля, используемые оболочкой для разделения текстовых строк.
MAIL: имя файла для почтового ящика текущего пользователя. Оболочка bash проверяет этот файл для новой почты.
MAILPATH: список из нескольких имен файлов для почтового ящика текущего пользователя. Оболочка bash проверяет каждый файл в этом списке для новой почты.
OPTARG: значение последнего аргумента параметра, обрабатываемого командой getopts.
OPTIND: значение индекса последнего аргумента параметра, обработанного командой getopts.
PATH: список каталогов, разделенных двоеточиями, где оболочка ищет команды.
PS1: строка приглашения командной строки основной командной строки.
PS2: строка приглашения интерфейса командной строки вторичной оболочки.

Переменные среды Shell bash:

BASH: полное имя пути для выполнения текущего экземпляра оболочки bash.
BASH_ENV: при установке каждый сценарий bash пытается запустить файл запуска, определенный этой переменной перед запуском.
BASH_VERSION: номер версии текущего экземпляра оболочки bash.
BASH_VERSINFO: массив переменных, содержащий отдельные основные и младшие номера версий текущего экземпляра оболочки bash.
COLUMNS: содержит ширину терминала терминала, используемую для текущего экземпляра оболочки bash.
COMP_CWORD: индекс в переменной COMP_WORDS, который содержит текущую позицию курсора.
COMP_LINE: текущая командная строка.
COMP_POINT: индекс текущей позиции курсора относительно начала текущей команды.
COMP_WORDS: переменный массив, содержащий отдельные слова в текущей командной строке.
COMPREPLY: переменный массив, содержащий возможные коды завершения, генерируемые функцией оболочки.
DIRSTACK: массив переменных, содержащий текущее содержимое стека директорий.
EUID: эффективный идентификатор пользователя текущего пользователя.
FCEDIT: редактор по умолчанию, используемый командой fc.
FIGNORE: список суффиксов, разделенных двоеточиями, для игнорирования при выполнении завершения имени файла.
FUNCNAME: имя исполняемой в данный момент функции оболочки.
GLOBIGNORE: список разделенных двоеточиями шаблонов, определяющих набор имен файлов, которые следует игнорировать, расширяя имя файла.
GROUPS: переменный массив, содержащий список групп, членом которого является текущий пользователь.
histchars: до трех символов, которые управляют расширением истории.
HISTCMD: номер истории текущей команды.
HISTCONTROL: Управляет тем, какие команды вводятся в списке истории оболочки.
HISTFILE: имя файла для сохранения списка истории оболочки (по умолчанию – история.bash).
HISTFILESIZE: максимальное количество строк для сохранения в файле истории.
HISTIGNORE: список шаблонов, разделенных двоеточием, используемый для определения того, какие команды игнорируются для файла истории.
HISTSIZE: максимальное количество команд, хранящихся в файле истории.
HOSTFILE: содержит имя файла, который должен быть прочитан, когда оболочке необходимо заполнить имя хоста.
HOSTNAME: имя текущего хоста.
HOSTTYPE: Строка, описывающая машину bash-shell, работает.
IGNOREEOF: количество последовательных символов EOF, которые должна получить оболочка перед выходом. Если это значение не существует, по умолчанию оно равно единице.
INPUTRC: имя файла инициализации Readline (по умолчанию – .inputrc).
LANG: категория локали для оболочки.
LC_ALL: переопределяет переменную LANG, определяя категорию локали.
LC_COLLATE: устанавливает порядок сортировки, используемый при сортировке строковых значений.
LC_CTYPE: Определяет интерпретацию символов, используемых при расширении имени файла и сопоставлении с образцом.
LC_MESSAGES: определяет параметр локали, используемый при интерпретации строк с двойными кавычками, которым предшествует знак доллара.
LC_NUMERIC: указывает локальную настройку, используемую для форматирования чисел.
LINENO: номер строки в исполняемом скрипте.
LINES: Определяет количество линий, доступных на терминале.
MACHTYPE: строка, определяющая тип системы в формате cpu-company-system.
MAILCHECK: как часто оболочка должна проверять (по умолчанию 60 секунд) для новой почты.
OLDPWD: предыдущий рабочий каталог, используемый в оболочке.
OPTERR: если установлено значение 1, оболочка bash отображает ошибки, сгенерированные командой getopts.
OSTYPE: Строка, определяющая операционную систему, в которой работает оболочка.
PIPESTATUS: переменный массив, содержащий список значений статуса выхода из процессов процесса переднего плана.
POSIXLY_CORRECT: если установлено, bash запускается в режиме POSIX.
PPID: идентификатор процесса (PID) родительского процесса оболочки bash.
PROMPT_COMMAND: если установлено, команда для выполнения перед отображением первичного приглашения.
PS3: приглашение использовать команду select.
PS4: подсказка, отображаемая до того, как командная строка будет эхом, если используется параметр bash -x.
PWD: текущий рабочий каталог.
RANDOM: возвращает случайное число от 0 до 32767. Присвоение значения этой переменной сгенерирует генератор случайных чисел.
REPLY: переменная по умолчанию для команды чтения.
SECONDS: количество секунд с момента запуска оболочки. Присвоение значения сбрасывает таймер на значение.
SHELLOPTS: список разрешенных опций оболочки bash, разделенных двоеточием.
SHLVL: указывает уровень оболочки, увеличивающийся на единицу при каждом запуске новой оболочки bash.
TIMEFORMAT: формат, определяющий, как оболочка отображает значения времени.
TMOUT: значение того, как долго (в секундах) команды выбора и чтения должны ждать ввода. Значение по умолчанию, равное нулю, означает, что нужно ждать бесконечно.
UID: реальный идентификатор пользователя текущего пользователя.

Вы можете заметить, что после использования команды set отображаются не все переменные среды по умолчанию. Объяснением этого может быть то, что хотя это переменные среды по умолчанию, не все из них должны содержать значение.

Вывод

В этом руководстве мы рассмотрели мир переменных среды Linux. Глобальные переменные окружения часто получают доступ к любому дочернему процессу, порожденному процессом, в котором они определены. Локальные переменные окружения будут доступны только из процесса, в котором они определены.

Система Linux использует каждую глобальную и локальную переменные среды для хранения информации о системной среде. Вы сможете получить доступ к этой информации из интерфейса командной строки оболочки, а также для внутренних сценариев оболочки. Оболочка bash использует переменные системной среды, определенные в исходной оболочке UNO Bourne, также как и множество новых переменных среды. Переменная среды PATH определяет шаблон поиска, который принимает оболочка bash для поиска исполняемой команды. Вы сможете изменить переменную среды PATH, чтобы добавить свои собственные каталоги или, возможно, текущий символ каталога, чтобы упростить работу с вашими программами. Вы также можете создавать свои собственные глобальные и локальные переменные среды для собственного использования. После создания переменной среды она доступна для всего сеанса оболочки.

Существует много файлов запуска, которые запускают оболочку bash после ее запуска. Эти файлы запуска могут содержать определения переменных среды для установки стандартных переменных среды для каждого сеанса bash. После входа в систему Linux оболочка bash обращается к файлу запуска /etc/profile, а также к трем локальным файлам запуска для каждого пользователя, $HOME/.bash, $HOME/.bash login и $HOME/.profile.

Пользователи будут настраивать эти файлы для включения переменных среды и сценариев запуска для собственного использования. Оболочка bash дополнительно предоставляет переменные массивы окружения. Эти переменные среды могут содержать несколько значений в одной переменной. Вы сможете получить доступ к значениям индивидуально, указав значение индекса или в целом, указав полное имя массива переменных среды. Наконец, в этом руководстве мы должны упомянуть использование командных псевдонимов. Хотя не переменные среды, псевдонимы команд ведут себя почти как переменные среды. Они позволяют вам определять псевдоним для команды вместе с ее параметрами. Вместо того, чтобы вводить очень длинную команду и параметры, вы сможете просто присвоить ей простой псевдоним и использовать псевдоним в любое время в сеансе оболочки.

Переменные окружения Linux вместе с переменными оболочки — то, что определяет настройки в рамках пользовательской сессии.

Они загружаются автоматически, но могут быть переопределены. Окружение создается каждый раз при логине в систему.

Переменные окружения Linux, переменные оболочки

Переменные окружения используются для процесса пользовательского shell и всех порождаемые в нем дочерних процессах.

Переменные оболочки содержат данные, которые определяют состояние текущей сессии. Например, текущая директория.

В каждой сессии используются и переменные окружения, и переменные оболочки.

Список переменных окружения можно посмотреть выполнив printenv или env

……
LC_MEASUREMENT=ru_RU.UTF-8
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_PAPER=ru_RU.UTF-8
LC_MONETARY=ru_RU.UTF-8
LANG=en_US.UTF-8
……

Разница в том, что printenv позволяет выводить данные по определенной переменной — например:

Преимущество env в том, что появляется возможность передать переменную определенной команде

Например:

env SHELL=»/bin/bash» ls -la /opt

Просмотреть переменные среды

BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
……

Вывод можно перенаправить в less , чтобы в нем удобнее было ориентироваться

Чтобы не изменяя текущее окружение избавиться от лишней информации в выводе можно сделать так

В POSIX режиме не будут выводиться заданные bash функции

Самые часто используемые переменные:
  • SHELL — оболчка, которая интерпретирует команды
  • USER — пользователь
  • PWD — текущий каталог
  • TERM — тип, терминала, который эмулируется

Команды в оболочке позволяют менять значение переменных. Так pwd выводит в консоль текущую директорию

/home/admin

Это переменная оболочки PWD

admin@desktop:~$ set | grep PWD

OLDPWD=/tmp
PWD=/home/admin

Перейдем в /tmp и посмотрим как изменится значение

admin@desktop:~$ cd /tmp/

admin@desktop:/tmp$ set | grep PWD

OLDPWD=/home/admin
PWD=/tmp

Можно увидеть при смене каталога просто меняется значение переменной shell-а PWD, также изменяется и OLDPWD

Как установить переменную окружения или оболчки

Переменная оболочки добавляется следующим образом

SOMEVAR="Hi there"

В выводе env ее не будет, потому, что это переменная именно shell, а не окружения

Просмотреть содержимое можно через echo добавив знак $ перед именем

Hi there

Чтобы переменную добавить в окружение ее нужно экспортировоать

export SOMEVAR=»Hi there»

SOMEVAR=Hi there

После этого значение будет наследоваться дочерними процессами.

Удалить переменную окружения можно той же командой export с ключем -n

Из оболочки значение удаляется unset

Автоматическая загрузка переменных при логине

Linux системы используют файлы ~/.bashrc , ~/.bash_profile , ~/.bash_login или ~/.profile для определение переменных. Файлы считываются при логине, какой из них используется зависит от дистрибутива.

В Ubuntu/Debain это ~/.bashrc. В него добавляются как переменные окружения, так и переменные оболочки.

Самым первым считывается /etc/profile . В нем задано и может быть переопределено какие файлы и в каком порядке использовать дальше.

Для non-login сессии переменные задаются в /etc/bash.bashrc. Такая сессия свойственна для скриптов, запускаемых в фоне.

Для большинства задач достаточно отредактировать ~/.bashrc .

Переменные окружения в Linux - это специальные переменные, определенные оболочкой и используемые программами во время выполнения. Они могут определяться системой и пользователем. Системные переменные окружения Linux определяются системой и используются программами системного уровня.

Например, команда PWD использует системную переменную, чтобы сохранять прежнюю рабочую директорию. Пользовательские переменные окружения устанавливаются пользователем, для текущей оболочки, временно или постоянно. Вся концепция добавления и удаления переменных оболочки крутится вокруг нескольких файлов, команд и различных оболочек.

Если смотреть более широко, переменная окружения может быть трех типов:

1. Локальные переменные окружения

Эти переменные определены только для текущей сессии. Они будут безвозвратно стерты после завершения сессии, будь то удаленный доступ или эмулятор терминала. Они не хранятся ни в каких файлах, а создаются и удаляются с помощью специальных команд.

2. Пользовательские переменные оболочки

Эти переменные оболочки в Linux определяются для конкретного пользователя и загружаются каждый раз когда он входит в систему при помощи локального терминала, или же подключается удаленно. Такие переменные, как правило, хранятся в файлах конфигурации: .bashrc, .bash_profile, .bash_login, .profile или в других файлах, размещенных в директории пользователя.

3. Системные переменные окружения

Эти переменные доступны во всей системе, для всех пользователей. Они загружаются при старте системы из системных файлов конфигурации: /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.

Конфигурационные файлы переменных окружения Linux

Здесь мы кратко рассмотрим различные конфигурационные файлы, перечисленные выше, которые используются для настройки переменных окружения для всей системы или конкретного пользователя.

.bashrc

Это файл переменных конкретного пользователя. Загружается каждый раз, когда пользователь создает терминальный сеанс, то есть проще говоря, открывает новый терминал. Все переменные окружения, созданные в этом файле вступают в силу каждый раз когда началась новая терминальная сессия.

.bash_profile

Эти переменные вступают в силу каждый раз когда пользователь подключается удаленно по SSH. Если этот файл отсутствует система будет искать.bash_login или.profile.

/etc/environment

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

/etc/bash.bashrc

Системный bashrc. Этот файл выполняется для каждого пользователя, каждый раз когда он создает новую терминальную сессию. Это работает только для локальных пользователей, при подключении через интернет, такие переменные не будут видны.

/etc/profile

Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал.

Все переменные окружения Linux созданные с помощью этих файлов, могут быть удаленны всего лишь удалением их оттуда. Только после каждого изменения, нужно либо выйти и зайти в систему, либо выполнить эту команду:

source имя_файла

Добавление пользовательских и системных переменных окружения в Linux

Теперь, когда вы знаете немного теории, перейдем к практике. Локальные переменные окружения в Linux можно создавать следующими командами:

var=значение
$ export var=значение

Эти переменные будут доступны только для текущей терминальной сессии.

Для удаления переменных окружения можно использовать несколько команд:

1. Использование env

По умолчанию с помощью env можно посмотреть все установленные переменные среды. Но с опцией -i она позволяет временно удалить все переменные оболочки и выполнить команду без переменных.

env –i команда

Var - это любая переменная, которую вы хотите передать этой команде.

Такая команда запустит оболочку вообще без переменных окружения:

После запуска такого окружения, не будет доступно никаких переменных, но после выхода все вернется на свои места.

2. Использование unset

Это другой способ удаления переменных окружения Linux. Unset удаляет переменную по имени до конца текущей сессии:

unset имя_переменной

3. Установить значение переменной в ""

Это самый простой способ удаления переменных окружения в Linux, устанавливая пустое значение переменной, вы удаляете ее до конца текущей сессии.

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

Создание пользовательских и системных переменных окружения

В этом разделе рассмотрим как установить и удалить системные и пользовательские переменные не только для текущего сеанса, а так чтобы эффект сохранялся после перезагрузки.

1. Устанавливаем и удаляем локальные переменные в Linux

Давайте создадим локальную переменную VAR и установим ей любое значение, затем удалим ее с помощью unset и убедимся что она удалена:

VAR1="Losst"
$ echo $VAR1
$ unset VAR1
$ echo $VAR1

Другой способ создать переменную - команда export. Удалим ее присвоив пустое значение:

export VAR="Losst"
$ echo $VAR
$ VAR=
$ echo $VAR

Теперь создадим переменную VAR2 также зададим ей значение. А потом временно удалим все локальные переменные выполнив env -i. Она запустит оболочку без каких-либо переменных. После ввода exit все переменные будут восстановлены.

VAR2="Losst"
$ echo $VAR2
$ env -i bash
$ echo $VAR2

Установка и удаление пользовательских переменных

Отредактируйте файл.bashrc, в вашей домашней директории, добавив команду export, для экспортирования нужной переменной. Затем выполните команду source для применения изменений. Создадим, например, переменную CD:

Добавьте такую строчку (o, затем вставить, затем Esc и:wq):

export CD="This is Losst Home"

Теперь осталось обновить конфигурацию:

source .bashrc
$ echo $CD

Для удаления этой переменной просто удалите ее из.bashrc.

Теперь добавим переменную окружения с помощью.bash_profile. Эта переменная, как вы уже знаете будет доступна только при удаленном входе:

vi .bash_profile

Добавьте строчку:

export VAR2="This is Losst Home"

И выполните эти команды, чтобы применить изменения и проверить добавление переменной:

source .bash_profile
$ echo $VAR2

Переменная недоступна, так как вы создали локальную терминальную сессию, теперь подключитесь по ssh:

ssh user@localhost
$ echo $VAR2

Удалить эту переменную окружения можно так же как и в предыдущем случае, удалив ее из файла.

Замечание: Эти переменные доступны всегда, но не для всех пользователей.

Установка и удаление системных переменных окружения

Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /etc/bash.profile:

vi /etc/bash.profile

export VAR="This is system-wide variable"

Затем обновляем:

source /etc/bash.bashrc

Теперь эта переменная доступна для всех пользователей, во всех терминалах:

echo $VAR
$ sudo su
$ echo $VAR
$ su -
$ echo $VAR

Если вы хотите сделать переменную окружения доступной для всех пользователей, которые подключаются к этой машине удаленно, отредактируйте файл /etc/profile:

export VAR1="This is system-wide variable for only remote sessions"

Обновите конфигурацию, и проверьте доступность переменной, она будет доступна только удаленно:

source /etc/profile
$ echo $VAR1

Если нужно добавить переменную окружения в Linux, так чтобы она была доступна и удаленно, и для локальных сессий, экспортируйте ее в /etc/environment:

vi /etc/environment

export VAR12="I am available everywhere"

Проверяем:

source /etc/environment
$ echo $VAR12
$ sudo su
$ echo $VAR12
$ exit
$ ssh localhost
$ echo $VAR12

Переменные окружения (environment variable ) используются для хранения общих значений переменных в пределах разных сценариев и программ. Такие переменные можно устанавливать на время, например на период работы конкретной оболочки терминала, или на период сессии пользователя, либо же установить переменную окружения на глобальном уровне - для всей системы.

Переменные окружения

$HOME
Переменная содержит путь к домашнему каталогу текущего пользователя. $USER
Имя текущего пользователя $PATH
Список каталогов для поиска оболочкой исполняемых программ. $PWD
Путь к текущему рабочему каталогу (либо pwd ). Пример: dir_path=$(pwd) . $SHELL
Интерпретатор по умолчанию $RANDOM
Генерирует рандомное число 0..32767 при каждом доступе к переменной. $SECONDS
Время в сек. с момента запуска командной оболочки. $? Результат выполнения предыдущей команды. $HOSTNAME
Имя компьютера $HISTFILE
Путь к файлу истории интерпретатора $IFS
Список символов-разделителей команд, параметров, элементов массива (по умолчанию: пробел, таб, новая строка) $PS1
Шаблон строки приглашения интерпретатора.

Временная установка переменной окружения

Установка переменной окружения на период сессии:

# Для нового процесса env имя_переменной=значение [команда] # Для текущей оболочки и всех ее подпроцессов export имя_переменной=значение [команда]

Значение переменной сохраняется до перезагрузки системы.

Установка постоянного значения

Переменные окружения на уровне системы устанавливаются через файл /etc/environment:

ENVIRONMENT="dev"

Установка переменной окружения для конкретного пользователя через файл ~/ .bashrc или ~/.bash_profile:

PATH="${PATH}:/home/user/bin:"

Внимание!

Файл ~/.bash_profile будет выполнен при запуске интерпретатора с ключом -l. При локальном входе этот файл не читается!

Также нужно помнить, что изменения вступят в силу только после перезагрузки сеанса!

Просмотр значения переменной окружения

Для просмотра значения переменной окружения есть команда printenv:

Printenv <имя_переменной>

#shell, #bash, #environment

Типы переменных

Как видно из примеров, приведенных выше, переменные командной оболочки принято записывать заглавными буквами. В Bash хранятся списки переменных двух типов:

Глобальные переменные

Глобальные переменные или переменные среды окружения доступны во всех оболочках. Чтобы показать переменные среды окружения, можно использовать команды env или printenv . Эти команды поставляются в составе пакета sh-utils .

Ниже показан типичный результат выдачи:

Franky ~> printenv CC=gcc CDPATH=.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=:0 DOMAIN=hq.garrels.be e= TOR=vi FCEDIT=vi FIGNORE=.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=Default GNOME_DESKTOP_SESSION_ID=Default GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/.gtkrc-1.2-gnome2 GWMCOLOR=darkgreen GWMTERM=xterm HISTFILESIZE=5000 history_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.hq.garrels.be INPUTRC=/etc/inputrc IRCNAME=franky JAVA_HOME=/usr/java/j2sdk1.4.0 LANG=en_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.sh %s LEX=flex LOCAL_MACHINE=octarine LOGNAME=franky LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: MACHINES=octarine MAILCHECK=60 MAIL=/var/mail/franky MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man MEAN_MACHINES=octarine MOZ_DIST_BIN=/usr/lib/mozilla MOZILLA_FIVE_HOME=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin MTOOLS_FAT_COMPATIBILITY=1 MYMALLOC=0 NNTPPORT=119 NNTPSERVER=news NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins OLDPWD=/nethome/franky OS=Linux PAGER=less PATH=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:. PS1=\[\033franky is in \w\[\033 PS2=More input> PWD=/nethome/franky SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106 SHELL=/bin/bash SHELL_LOGIN=--login SHLVL=2 SSH_AGENT_PID=22161 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106 START_WM=twm TERM=xterm TYPE=type USERNAME=franky USER=franky _=/usr/bin/printenv VISUAL=vi WINDOWID=20971661 XAPPLRESDIR=/nethome/franky/app-defaults XAUTHORITY=/nethome/franky/.Xauthority XENVIRONMENT=/nethome/franky/.Xdefaults XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB XMODIFIERS=@im=none XTERMID= XWINHOME=/usr/X11R6 X=X11R6 YACC=bison -y

Локальные переменные

Локальные переменные доступны только в текущей командной оболочке. Если встроенная команда set используется без каких-либо параметров, то она выдаст список всех переменных (в том числе переменные среды исполнения) и функций. Воспользуемся форматированием и выдадим отсортированный результат, учитывающий локальность переменных.

Ниже приведен файл diff, созданный путем сравнения результата работы команд printenv и set , после удаления из списка функций, которые также отображаются командой set :

Franky ~> diff set.sorted printenv.sorted | grep "<" | awk "{ print $2 }" BASE=/nethome/franky/.Shell/hq.garrels.be/octarine.aliases BASH=/bin/bash BASH_VERSINFO=(="2" BASH_VERSION="2.05b.0(1)-release" COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/.bash_history HOSTTYPE=i686 IFS=$" LINES=24 MACHTYPE=i686-pc-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PIPESTATUS=(="0") PPID=10099 PS4="+ PWD_REAL="pwd SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor THERE=/home/franky UID=504

Деление переменных по их содержимому

Помимо деления переменных на локальные и глобальные, мы можем также разделить их на категории в зависимости от того, какое содержимое хранится в переменной. В этом отношении переменные подразделяются на четыре типа:

  • Строковые переменные
  • Целочисленные переменные
  • Переменные - константы
  • Переменные - массивы

Мы обсудим эти типы переменных в главе 10 . Сейчас мы будем использовать в наших переменных целочисленные и строковые значения.

Создание переменных

В переменных символы верхнего и нижнего регистров различаются и по умолчанию используются символы верхнего регистра. Иногда для записи локальных переменных принято использовать символы нижнего регистра. Однако, вы можете использовать для имен переменных любые символы и даже смешивать символы верхнего и нижнего регистров. В именах переменных можно также использовать цифры, но имена, начинающиеся с цифр, не допускаются:

Prompt> export 1number=1 bash: export: `1number=1": not a valid identifier

Чтобы в командной оболочке задать переменную, используйте следующую команду

VARNAME="value"

Вокруг знака равенства не следует вставлять пробелы — это приведет к ошибкам. Когда вы назначаете значения переменным, то хорошей привычкой является заключение содержимого строки в кавычки; это уменьшает шанс того, что вы сделаете ошибку.

Некоторые примеры использования верхнего и нижнего регистров, цифр и пробелов (сообщение command not found указывает на наличие проблемы — прим.пер. ):

Franky ~> MYVAR1="2" franky ~> echo $MYVAR1 2 franky ~> first_name="Franky" franky ~> echo $first_name Franky franky ~> full_name="Franky M. Singh" franky ~> echo $full_name Franky M. Singh franky ~> MYVAR-2="2" bash: MYVAR-2=2: command not found franky ~> MYVAR1 ="2" bash: MYVAR1: command not found franky ~> MYVAR1= "2" bash: 2: command not found franky ~> unset MYVAR1 first_name full_name franky ~> echo $MYVAR1 $first_name $full_name <--no output--> franky ~>

Экспорт переменных

Переменная, созданная так, как это показано в приведенном выше примере, доступна только в текущей командной оболочке. Это локальная переменная: дочерние процессы текущей командной оболочки не будут знать об этой переменной. Для того, чтобы передавать переменные в подоболочку, нам необходимо экспортировать ее с помощью встроенной команды export . Переменные, которые экспортируются, называются переменными среды окружения. Присваивание значения и экспорт обычно осуществляется за один шаг:

Export VARNAME="value"

Подоболочка может изменять переменные, которые наследуются из родительского процесса, но изменения, сделанные дочерним процессом, не влияют на родительский процесс. Это продемонстрировано в следующем примере:

Franky ~> full_name="Franky M. Singh" franky ~> bash franky ~> echo $full_name franky ~> exit franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M. Singh franky ~> export full_name="Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. Singh franky ~>

Когда в подоболочке первый раз делается попытка прочитать значение full_name , это значение не установлено (команда echo показывает пустую строку). После того, как происходит выход из подоболочки, переменная full_name экспортируется в родительскую оболочку - переменная может экспортироваться после того, как ей было присвоено значение. Затем запускается новая подоболочка, в которой будет видна переменная, экспортированная из родительской оболочки. Переменная изменяется и в ней будет запомнено другое значение, но в родительской оболочке значение этой переменной остается прежним.

Зарезервированные переменные

Зарезервированные переменные командной оболочки Bourne

В Bash используются определенные переменные командной оболочки, точно такие же, как в оболочке Bourne. В некоторых случаях, Bash назначает переменной значение, задаваемое по умолчанию. В таблице ниже приводится краткое описание этих простых переменных командной оболочки:

Таблица 3.1. Зарезервированные переменные командной оболочки Bourne

Имя переменной Определение

Список директориев, разделенных двоеточиями и используемые при поиске пути встроенной командой cd .

Домашний директорий текущего пользователя; используется по умолчанию во встроенной команде cd . Значение этой переменной используется также вместо символа "тильда".

Список символов, с помощью которых разделяются поля; используется, когда оболочка после выполнения всех замен разделяет результат на отдельные слова.

Если в этом параметре задано имя файла, а значение переменной MAILPATH не установлено, Bash проинформирует пользователя о получении письма в указанном файле.

Список имен файлов, разделенных двоеточиями, которые командная оболочка периодически проверяется на наличие новых писем.

Значение последнего аргумента в параметре, обработанного встроенной командой getopts .

Индекс последнего аргумента параметра, обработанного встроенной командой getopts .

Список директориев, разделенных двоеточиями, в которых командная оболочка ищет команды.

Первичная строка приглашения. Значение по умолчанию равно ""\s-\v\$ "".

Вторичная строка приглашения. Значение по умолчанию равно ""> "".

Зарезервированные переменные Bash

Значения этих переменных задаются или используются в Bash, но в других командных оболочках они обычно не рассматриваются как специальные.

Таблица 3.2. Зарезервированные переменные Bash

Имя переменной Определение

Эта переменная управляет тем, как оболочка взаимодействует с пользователем и выполняет задания.

Полный путь, используется для запуска текущего экземпляра Bash.

Если эта переменная задана в тот момент, когда Bash вызывается для выполнения скрипта, ее значение используется в качестве имени файла запуска, который должен быть прочитан перед выполнением скрипта.

Номер версии текущего экземпляра Bash.

Переменная — массив, используемая только для чтения, в элементах массива которой хранится информация, касающаяся версии данного экземпляра Bash.

Когда происходит печать выбранных списков, используется встроенной командой select для определения ширины терминала. Автоматически устанавливается при получении сигнала SIGWINCH .

Указатель в ${COMP_WORDS } для слова, в котором хранится текущая позиция курсора.

Текущая командная строка.

Указатель текущего положения курсора относительно начала текущей команды.

Переменная - массив, состоящая из отдельных слов, используемых в текущей командной строке.

Переменная - массив, из которого Bash считывает возможные варианты завершения строки, сгенерированные функцией командной оболочки, вызванной сервисом, предназначенным для программирования завершений

Переменная — массив, в которой хранится текущее состояние стека директориев.

Числовой действующий идентификатор пользователя ID текущего пользователя.

Редактор, используемый по умолчанию, когда во во встроенной команде fc указывается параметр -e

Список суффиксов, разделенных двоеточиями, которые должны игнорироваться при выполнении автоматического завершения имен файлов.

Имя функции командной оболочки, исполняемой в текущий момент.

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

Переменная - массив, в которой содержится список групп, к которым принадлежит текущий пользователь.

До трех символов, управляющих подстановкой из истории команд, быстрой подстановкой и разбиением сделанных подстановок на лексемы.

Номер текущей команды в истории команд или ее указатель в списке истории команд.

Определяет, будет ли команда добавляться в файл истории команд.

Имя файла, в котором сохраняется история команд. Значение по умолчанию: ~/.bash_history .

Максимальное количество строк, содержащихся в файле истории команд, по умолчанию - 500.

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

Максимальное количество команд, которое можно запомнить в списке истории команд, по умолчанию - 500.

Содержит имя файла в том же формате, что и файл /etc/hosts , которое может быть прочитано, когда командной оболочке требуется завершить имя хоста.

Имя текущего хоста.

Строка, описывающая машину, на которой работает Bash.

Управляет действием командной оболочки при получении ею в качестве завершающего символа входного потока символа EOF (символ конца файла).

Имя файла инициализации программы Readline, которым заменяется файл /etc/inputrc , использумый по умолчанию.

Используется для определения категории локализации (locale) для всех категорий, не заданных явно с помощью переменных, имена которых начинаются с символов LC_ .

Эта переменная переопределяет значение переменной LANG и всех остальных переменных, начинающихся с символов LC_ , задающих категорию локализации.

Эта переменная задает порядок сортировки, используемый при сортировке полученных по шаблону имен файлов, и определяет интерпретацию диапазонов, классов соответствий и правила сравнения символов для подстановки имен файлов и сопоставления с шаблоном.

Эта переменная определяет интерпретацию символов и принадлежность символов к определенному классу для подстановки имен файлов и сопоставления с шаблоном.

Эта переменная определяет категорию локализации, используемую для обработки строк в двойных кавычках, перед которыми указан символ $.

Эта переменная определяет категорию локализации для числового формата.

Номер строки в скрипте или в функции оболочки, которая исполняется в текущий момент.

Используется встроенной командой select для определения длины столбца, в который выводятся выбранные списки.

Строка, которая полностью описывает тип системы, на которой выполняется Bash, используется стандартный формат GNU CPU-COMPANY-SYSTEM.

Определяет (в секундах) как часто командная оболочка должна проверять почту в файлах, указанные в переменных MAILPATH или MAIL .

Предыдущий рабочий директорий, установленный с помощью встроенной команды cd .

Если установлено значение 1, то Bash отображает сообщения об ошибках, генерируемые встроенной командой getopts .

Строка, описывающая операционную систему, на которой работает Bash.

Переменная - массив, содержащая список значений состояний выхода из процессов в последнем конвейере (который может состоять из одной команды).

Если эта переменная добавлена в окружающую среду при запуске bash, командная оболочка переходит в режим POSIX.

Если эта переменная установлена, то значение интерпретируется как команда, которая выполняется перед каждой выдачей первичной строки приглашения (PS1).

Значение этой переменной используется для команды select в качестве строки приглашения. По умолчанию - ""#? ""

Значение строки приглашения, которое выдается перед командной строкой, когда установлен параметр -x , включающий эхо-выдачу командной строки; по умолчанию - ""+ "".

Текущий рабочий директорий, установленный встроенной командой cd .

Каждый раз, когда происходит обращение к этому параметру, генерируется случайное целое число в диапазоне от 0 до 32767. Значение этой переменной используется в генераторах случайных чисел.

Переменная, используемая по умолчанию во встроенной команде read .

В этой переменной указывается количество секунд, прошедших с момента запуска командной оболочки.

Список параметров, установленных в командной оболочке; разделены двоеточиями.

Увеличивается на единицу каждый раз, когда запускается новый экземпляр Bash.

Значение этого параметра используется в качестве строки, задающей формат выдачи информации о времени выполнения для конвейеров, перед которыми задано зарезервированное слово time .

Если в переменной TMOUT установлено значение больше нуля, то оно рассматривается как время ожидания, используемое по умолчанию во встроенной команде read . Когда командная оболочка запускается в интерактивном режиме, это значение интерпретируется как количество секунд, которое оболочка будет ждать ввод после выдачи первичной строки приглашения. В случае, если входные данные не поступают, то по истечению этого времени Bash завершает свою работу.

Числовое значение, реальный идентификатор пользователя ID для текущего пользователя.

Дополнительную информацию смотрите на страницах man по Bash или в документации. Некоторые переменные доступны только для чтения, значение некоторых устанавливается автоматически, а некоторые теряют свой смысл, когда для них устанавливается значение, отличающееся от значения, задаваемого по умолчанию.

Специальные параметры

Командная оболочка рассматривает некоторые параметры специальным образом. Эти параметры можно использовать только для получения из них значений, назначать им значения нельзя.

Таблица 3.3. Специальные переменные bash

Символ Определение

Возвращает позиционные параметры, начиная с первого. Когда параметр указывается в двойных кавычках, он заменяется одним словом, содержащим значениями каждого параметра, разделенными первым символом специальной переменной IFS .

Возвращает позиционные параметры, начиная с первого. Когда параметр указывается в двойных кавычках, то каждый параметр возвращается в отдельном слове.

Возвращает количество позиционных параметров, указываемых в виде десятичного значения.

Возвращает код возврата последнего конвейера, выполненном в приоритетном режиме (в режиме foreground — прим.пер.).

С помощью параметра "дефис" возвращаются флаги текущего параметра в том виде, как они были установлены при вызове встроенной команды set , или так, как они были установлены самой командной оболочкой (например, -i).

Возвращает идентификатор процесса командной оболочки.

Возвращает идентификатор процесса последней команды, выполненной в фоновом (асинхронном) режиме.

Возвращает имя командной оболочки или скрипта.

Значение параметра "подчеркивание" устанавливается при запуске командной оболочки и содержит полное имя командной оболочки или скрипта, которые выполняется в том виде, как он был передан в списке аргументов. Затем значение будет заменено последним аргументом предыдущей команды. В этом параметре также указывается полный путь к каждой команде, выполненной и помещенной в среду, которая была экспортирована в эту команду. Когда проверяется почта, в этом параметре содержится имя почтового файла.

Позиционные параметры являются словами, следующими за именем скрипта командной оболочки. Они запоминаются в переменных $1 , $2 , $3 и так далее. Переменные, по мере необходимости, добавляются во внутренний массив. В переменной $# указывается общее число параметров, так как это продемонстрировано в следующем простом скрипте:

# positional.sh # This script reads 3 positional parameters and prints them out. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo "$1 is the first positional parameter, \$1." echo "$2 is the second positional parameter, \$2." echo "$3 is the third positional parameter, \$3." echo echo "The total number of positional parameters is $#."

При запуске скрипта можно указывать любое число аргументов:

Franky ~> positional.sh one two three four five one is the first positional parameter, $1. two is the second positional parameter, $2. three is the third positional parameter, $3. The total number of positional parameters is 5. franky ~> positional.sh one two one is the first positional parameter, $1. two is the second positional parameter, $2. is the third positional parameter, $3. The total number of positional parameters is 2.

Подробнее об использовании этих параметров рассказывается в главе 7 "Условные инструкции" и в разделе "Встроенная команда shift" .

Некоторые примеры других специальных параметров:

Franky ~> grep dictionary /usr/share/dict/words dictionary franky ~> echo $_ /usr/share/dict/words franky ~> echo $$ 10662 franky ~> mozilla & 11064 franky ~> echo $! 11064 franky ~> echo $0 bash franky ~> echo $? 0 franky ~> ls doesnotexist ls: doesnotexist: No such file or directory franky ~> echo $? 1 franky ~>

Пользователь franky начинает с ввода команды grep , в результате чего назначается значение переменной _ . Идентификатор процесса этой оболочки равен 10662. Если выполнение какого-то задания переводится в фоновый режим, в переменной! будет находиться идентификатор процесса фонового задания. Работающей командной оболочкой является bash . Если была допущена ошибка, в переменной? будет находиться код возврата, отличающийся от 0 (нуля).

Расширение сферы применения скриптов, имеющих переменные

Помимо того, что благодаря переменным скрипт становится более удобочитаемым, переменные также помогут вам быстрее применить скрипт в других условиях или для других целей. Рассмотрим следующий пример - очень простой скрипт, который делает на удаленном сервере резервную копию домашнего директория пользователя franky :

#!/bin/bash # This script makes a backup of my home directory. cd /home # This creates the archive tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1 # First remove the old bzip2 file. Redirect errors because this generates some if the archive # does not exist. Then create a new compressed file. rm /var/tmp/home_franky.tar.bz2 2> /dev/null bzip2 /var/tmp/home_franky.tar # Copy the file to another host - we have ssh keys for making this work without intervention. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # Create a timestamp in a logfile. date >> /home/franky/log/home_backup.log echo backup succeeded >> /home/franky/log/home_backup.log

Прежде всего, у вас больше шансов сделать ошибки, если вы будет вручную задавать файлы и директории всякий раз, когда они вам понадобятся. Во-вторых, предположим, что пользователь franky хочет передать этот скрипт пользователю carol , тогда прежде, чем carol сможет использовать скрипт для резервного копирования своего домашнего директория, ему придется довольно много редактировать. То же самое случится, если пользователь franky захочет использовать этот скрипт для резервного копирования других директориев. Чтобы расширить сферу применения, используйте переменные для всех файлов, директориев, имен пользователей, имен серверов и т.д. Тогда вам потребуется изменить значение всего лишь один раз и не просматривать весь скрипт с тем, чтобы найти все места, где встречается конкретный параметр. Пример:

#!/bin/bash # This script makes a backup of my home directory. # Change the values of the variables to make the script work for you: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.tar BZIPFILE=/var/tmp/home_franky.tar.bz2 SERVER=bordeaux REMOTEDIR=/opt/backup/franky LOGFILE=/home/franky/log/home_backup.log cd $BACKUPDIR # This creates the archive tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # First remove the old bzip2 file. Redirect errors because this generates some if the archive # does not exist. Then create a new compressed file. rm $BZIPFILE 2> /dev/null bzip2 $TARFILE # Copy the file to another host - we have ssh keys for making this work without intervention. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Create a timestamp in a logfile. date >> $LOGFILE echo backup succeeded >> $LOGFILE

В продолжение темы:
Android

| Отдых и увлечения | Быт | Архив | RSS Биллинг в банковской деятельности: система расчётов, удобная для всех В ассортимент услуг практически любого банка входит...

Новые статьи
/
Популярные