воскресенье, 13 января 2008 г.

Советы по bash, часть 2

Как и обещал, я нашел у себя время для того чтобы почитать man bash. :) Честно признаюсь, что прочитал его не весь, а только те разделы, которые были наиболее интересны для меня. Вот некоторые интересные настройки, которые мне удалось найти кроме Советы и подсказки по bash.


Следующие команды прописываются в файле ~/.inputrc:
Внимание! При создании файла ~/.inputrc вставьте в его начало строку
$include /etc/inputrc
Иначе у вас не будет подгружаться "дистрибутивный" /etc/inputrc, и, возможно, терминал будет работать не совсем так, как вам хотелось бы. К примеру, у меня без этой строки не работали горячие клавиши Ctrl+стрелки.

Команды прописываются следующим образом (пример):
set bell-style visible

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

bell-style (audible) - определяет, как будет вести себя "звонок". К примеру по умолчанию, если вы в консоли напишите строку, которой не может соответствовать ни одна команда, и нажмете на клавишу <TAB>, встроенный в корпус динамик подаст сигнал (в продвинутых современных терминалах сигнал могут подавать колонки). Значение none означает отключить динамик, значение visible задает отображение сигнала в виде мигающего окна терминала (как в VIM после выполнения set visualbell) вместо сигнала динамика. На мой взгляд, значение visible наиболее удобно.

completion-query-items (100) - задает максимальное количество файлов (команд), которое bash будет отображать без предупреждения при нажатии на клавишу <TAB>.

editing-mode (emacs) - если присвоить этой переменной значение vi, то работа с консолью станет очень похожа на работу в текстовом редакторе vi (поддерживаются основные сочетания клавиш). Однозначно для фанатов. :)

expand-tilde (off) - заставляет bash заменять знак ~ на /home/user_name.

mark-symlinked-directories (off) - добавлять или нет символ / при автодополнении имени файла, когда файл является символической ссылкой на директорию.


Коды возврата команд, выполняемых в конвейере

Если выполнить конвейер
echo 'One text' | grep 'Another text' | cat
то в переменную $? запишется код завершения команды cat, т. е. 0, несмотря на то, что команда grep возвратила в качестве кода 1.

После выполнения команды
set -o pipefail
тот же самый конвейер запишет в переменную $? значение 1.

Опция pipefail задает такое поведение bash, что если при выполнении конвейера все команды возвратили 0, то в переменную $? запишется 0, если хотя бы одна команда возвратила ненулевое значение, то в $? запишется код возврата самой правой команды в конвейере из тех, что завершились с ненулевым кодом возврата.


Переменные окружения
Примечание: переменные окружения можно задать в ~/.bashrc следующим образом (пример):
export HISTCONTROL="ignoredups"

PIPESTATUS - лично для меня это просто находка. Давно нуждался в подобной переменной, но не знал, что она существует. Эта переменная-массив, содержащая коды возврата каждой команды учавствующей в конвейере. Т. е. если вы запустите, например, cat foo | grep bla-bla-bla, то ${PIPESTATUS[0]} выдаст код возврата команды cat, а ${PIPESTATUS[1]} - код возврата grep. Внимание, запуск единственной команды тоже изменяет значение данной переменной! Просто количество элементов этого массива в таком случае будет равено 1.

RANDOM - переменная, возвращающая при каждом обращении к ней случайное число в диапазоне от 0 до 32767.

COLUMNS - текущая ширина терминала в символах.

LINES - текущая высота терминала в строках.

HISTCONTROL - Если имеет значение ignorespace, строки, начинающиеся символом пробела, не попадают в список выполненных команд. Если имеет значение ignoredups, строки, совпадающие с последней выполненной командой, в список выполненных команд не попадают. Значение ignoreboth сочетает действие обеих представленных опций. Если переменной нет или она имеет какое-то другое значение, кроме перечисленных выше, все строки, прочитанные синтаксическим анализатором, сохраняются в списке истории, с учетом значения переменной HISTIGNORE. Действие этой переменной переопределяется переменной HISTIGNORE. Вторая и следующие строки многострочной составной команды не проверяются, и добавляются в список истории независимо от значения HISTCONTROL.

HISTFILESIZE - Максимальное количество строк, содержащееся в файле истории. Если этой переменной присвоено значение, файл истории, при необходимости, усекается, и будет содержать не больше, чем указанное количество строк. Стандартное значение - 500. Файл истории также усекается до этого размера после записи при выходе из интерактивного командного интерпретатора.

HISTIGNORE - Список шаблонов через двоеточие, используемых для принятия решения о сохранении командных строк в списке истории. Каждый шаблон привязывается к началу строки и должен задавать всю строку ('*' неявно не добавляется). Каждый шаблон сравнивается со строкой после проверок, задаваемых переменной HISTCONTROL. Кроме обычных символов сопоставления с образцом в командном интерпретаторе, символ '&' сопоставляется с предыдущей строкой в списке истории. Символ '&' можно экранировать с помощью обратной косой. Перед сопоставлением обратная косая убирается. Вторая и последующая строки составной многострочной команды не проверяются и добавляются в список истории независимо от значения переменной HISTIGNORE.
Пример: export HISTIGNORE="&:ls:[bf]g:exit"

HISTSIZE - Максимальное количество команд, которое может храниться в файле истории. Стандартное значение - 500.

HISTTIMEFORMAT - Если установлена, то в файл истории помимо самих команд будет также писаться время, когда их вводили. Сама же строка HISTTIMEFORMAT должна описывать формат вывода времени/даты, который аналогичен формату, используемому в функции strftime(3).

PROMPT_COMMAND - Если значение задано, оно выполняется как команда перед выдачей каждого первичного приглашения.

PS1 - Значение этого параметра обрабатывается и используется для установки строки первичного приглашения. Стандартное значение - "\s-\v\$ ".

PS2 - Значение этого параметра обрабатывается, как и PS1, и используется для установки строки вторичного приглашения. Стандартное значение - "> ".

PS3 - Значение этого параметра используется в качестве приглашения для команды select.

PS4 - Значение этого параметра обрабатывается, как и PS1, и выдается перед каждой командой, показываемой интерпретатором bash в ходе трассировки выполнения. Первый символ PS4 повторяется необходимое количество раз, показывая уровень вложенности. Стандартное значение - "+".

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

Анонимный комментирует...

Говоря о переменных окружения, обязательно нужно упомянуть о файле /etc/environment в котором определяются системные переменные окружения. Зачастую удобнее определить переменную глобально, чем прописывать ее установку ее заначения каждому пользователю в ~/.bashrc