вторник, 8 января 2013 г.

Стандартные потоки и переменные среды



Стандартный ввод

stdin (поток номер 0) зарезервирован для чтения команд пользователя или входных данных.

При интерактивном запуске программы по умолчанию нацелен на чтение с устройства текстового интерфейса пользователя (клавиатуры).
Командная оболочка UNIX (и оболочки других систем) позволяют изменять цель этого потока с помощью символа «<». Системные программы, как правило, не пользуются этим потоком.

Стандартный вывод

stdout (поток номер 1) зарезервирован для вывода данных, как правило текстовых.

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

Стандартный вывод ошибок

stderr (поток номер 2) зарезервирован для вывода диагностических и отладочных сообщений в текстовом виде.

Чаще всего цель этого потока совпадает с stdout, однако, в отличие от него, цель потока stderr не меняется при «>» и создании конвейеров («|»). То есть, отладочные сообщения процесса, вывод которого перенаправлен, всё равно попадут пользователю.
Командная оболочка UNIX позволяет изменять цель этого потока с помощью конструкции «2>». Например, для подавления вывода этого потока нередко пишется 2>/dev/null.

В результате ввода команды в консоль, образуется два вариант потока: stdout (команда выполнена верно $ ls /home) и stderr (произошла ошибка $ ls /home_1 каталога не существует).

Чтобы направить выводимые данные в файл, используется знак >, пример:
$ echo 'Hello' > file.txt
$ cat file.txt
Hello
при использовании знака >, каждый раз при записи файла, вы стираете его предыдущее содержимое (перезапись)
$ echo 'Second line' > file.txt
$ cat file.txt
Second line

Для добавления данных файл используется знак >>, пример:
$ cat file.txt
Hello
$ echo 'Second line' >> file.txt
$ cat file.txt
Hello
Second line

Переменные среды устанавливаются пользователем или сценариями оболочки. Начальный набор переменных задаётся стартовыми сценариями операционной системы и сценариями, запускаемыми при регистрации пользователя в системе, в частности, /etc/profile и ~/.bash_profile.

Фрагменты информации, полезные для конфигурации командной консоли, находятся в переменных среды
Как правило пишутся они с заглавных букв ($HOSTNAME, $PATH).

Отобразим все переменные среды:
$ set
гораздо удобнее использовать команду:
$ set | less
либо
$ set | more

Возможна самостоятельная установка и удаление переменных окружения:
$ MYTEST=56
$ echo $MYTEST
56

Созданная переменная существует только в данной консоли, в которой она создана, то есть при запуске нового сеанса bash переменной не существует:
$ bash
$ echo $MYTEST
$ (пустая строка)

Для отображения всех переменных окружения bash, введем:
$ env
MATE_DESKTOP_SESSION_ID=this-is-deprecated
SSH_AGENT_PID=2174
GPG_AGENT_INFO=/tmp/keyring-SSYieJ/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=1501da290bf45a57efba5d5c50b08c92-1357554099.837482-939212275
MATE_KEYRING_CONTROL=/tmp/keyring-SSYieJ
OLDPWD=/home/amet13
USER=amet13
LIBGL_DRIVERS_PATH=/usr/lib/dri
DESKTOP_AUTOSTART_ID=106893101d1868f004135755410044383100000021040023
SSH_AUTH_SOCK=/tmp/keyring-SSYieJ/ssh
MATECORBA_SOCKETDIR=/tmp/matecorba-amet13
SESSION_MANAGER=local/mint-14:@/tmp/.ICE-unix/2104,unix/mint-14:/tmp/.ICE-unix/2104
USERNAME=amet13
DEFAULTS_PATH=/usr/share/gconf/default.default.path
XDG_CONFIG_DIRS=/etc/xdg/xdg-default:/etc/xdg
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
DESKTOP_SESSION=default
PWD=/home/amet13/Загрузки
LANG=ru_UA.UTF-8
MANDATORY_PATH=/usr/share/gconf/default.mandatory.path
MDM_XSERVER_LOCATION=local
SHLVL=1
HOME=/home/amet13
LOGNAME=amet13
XDG_DATA_DIRS=/usr/share/default:/usr/local/share/:/usr/share/:/usr/share/mdm/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-aojuMDqRfg,guid=163673ac9e8f8184e0436cd750eaa1b4
MDMSESSION=default
WINDOWPATH=8
XDG_RUNTIME_DIR=/run/user/amet13
DISPLAY=:0
MDM_LANG=ru_UA.UTF-8
XAUTHORITY=/home/amet13/.Xauthority
_=/usr/bin/env

1 комментарий:

wimbo комментирует...

а практическое применение этого всего - это скрипты :) ну и конечно еще можно вспомнить о tee в тему про потоки