Поднятая целина: Осваиваем и обустраиваем консоль

Командная оболочка UNIX (англ. Unix shell, часто просто «шелл») — командный интерпретатор, используемый в операционных системах семейства Unix, в котором пользователь может либо давать команды операционной системе по отдельности, либо запускать скрипты, состоящие из списка команд.

Как узнать правильный путь к интерпретатору BASH

Обычно в linux интерпретатор BASH находится по пути /bin/bash, но там его может не быть по независящим от вас причинам. Тогда имеем смысл попробовать ввести команду whereis bash и посмотреть на результаты, которые она выдаст:

[email protected]:~# whereis bash bash: /bin/bash /etc/ /usr/share/man/man1/

Как видно на примере выше, было найдено три совпадения:

  1. /bin/bash — путь до интерпретатора (именно то, что требуется)
  2. /etc/ — конфигурационный файл с переменными окружения BASH пользователя
  3. /usr/share/man/man1/ — файл справочной информации для BASH

Нужно помнить, что если whereis не находит BASH, то это не значит, что его нет в системе. Тут имеет смысл посмотреть глобальную переменную окружения $PATH, но обычно этого не требуется. Поэтому дальше не вижу смысла углубляться в детали.

Автодополнение bash

Одна из самых удобных функций, имеющихся в bash — автодополнение команд по клавише <Tab>. К этому быстро привыкаешь, и кажется, что улучшить уже ничего нельзя. Однако в разных дистрибутивах автодополнение работает по-разному.

Например, в современных Linux-дистрибутивах, ориентированных на обычного пользователя, bash не только дополняет саму команду, но и предлагает дополнительные параметры. Однако в Gentoo и производных (вроде Calculate Linux) такого нет. Здесь приходится помнить все параметры назубок. Как такое может быть? Некоторые разработчики дистрибутивов используют патченые версии bash? На самом деле, возможность автодополнения в bash — расширяемая функция. За необходимую функциональность отвечает встроенная команда compgen, генерирующая соответствующие списки. Все настройки производятся в файле /etc/bash_completion (или пользовательском ~/.bash_completion), хотя в некоторых дистрибутивах можно найти целый каталог /etc/bash_completion.d, в котором обычно собраны настройки, специфичные для отдельных программ.

Читайте также:  Яндекс браузер тормозит причины и решение глюков

В самом простом случае файл содержит программу и указания для bash по дополнению имен файлов.

Например, чтобы MPlayer предлагал пользователю в качестве автодополнения только файлы с расширением avi и mpg, пишем такое правило: complete -f -X ‘!*[email protected](avi|mpg|AVI|MPG/so)’ mplayer Но это самый простой вариант, ведь MPlayer имеет большое количество дополнительных параметров, а значит, ему потребуется описать шрифты, звуковые файлы, субтитры и так далее. Все это легко решается при помощи оператора case. Поддерживаются регулярные выражения, что немного упрощает создание правил.

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

Например, для tar создаем такое правило:

COMPREPLY=( $( compgen -W ‘c t x u r d A’ — «$cur» ) )

Как видишь, мы просто перечислили все параметры, и теперь в процессе ввода bash сам выдаст этот список. Команда compgen имеет ряд параметров. Так ‘-b’ позволяет получить список встроенных команд оболочки, ‘-c’ — имена команд, ‘-v’ — имена переменных и так далее. Все подробности можно найти в man-странице bash, в секциях complete и compgen.

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

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

  • /etc/environment — Используйте этот файл для настройки общих системных переменных. Переменные в этом файле устанавливаются в следующем формате

    FOO=barVAR_TEST=»Test Var»

  • /etc/profile — Переменные, заданные в этом файле, загружаются при каждом входе в оболочку bash. Чтобы объявить переменные окружения в этом файле вам нужно использовать команду экспорта:

    export JAVA_HOME=»/path/to/java/home» export PATH=$PATH:$JAVA_HOME/bin

  • Конфигурационные файлы для отдельных пользовательских оболочек. Например, если вы используете Bash, вы можете объявить переменные в ~ / .bashrc:

    export PATH=»$HOME/bin:$PATH»

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

source ~/.bashrc

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

Оператор OR (||)

Оператор OR (||) очень похож на оператор «else» в программировании. Вышеуказанный оператор позволяет вам выполнять вторую команду только в случае сбоя при выполнении первой команды, то есть состояние выхода первой команды равно «1» — программа выполнена НЕ успешно».

Например, я хочу выполнить «apt-get update» из учетной записи без полномочий root, и если первая команда не будет выполнена, тогда будет выполнена вторая команда «links ».

sudo apt update || links

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

Что, если первая команда выполнена успешно, со статусом выхода ««? Очевидно! Вторая команда не будет выполнена.

mkdir test || links

Здесь пользователь создает папку «test» в своем домашнем каталоге, где ему это разрешено. Команда выполнена успешно, что дает статус выхода ««, и, следовательно, последняя часть команды не выполняется.

Потоки

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

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

0 stdin, ввод 1 stdout, вывод 2 stderr, поток ошибок

При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:

command 2>&1 # ошибки (stderr) в stdout command > ~/ 2>&1 # stdout в файл command &> ~/ # весь вывод в файл

Перенаправление потоков

Для перенаправления потоков используются основные команды: <, >, >>, <<<, |. Рассмотрим как можно перенаправлять стандартные потоки.

Перенаправление потока вывода:

> перенаправить поток вывода в файл (файл будет создан или перезаписан) >> дописать поток вывода в конец файла

Перенаправление потока ввода (прием данных):

< файл в поток ввода (файл будет источником данных) <<< чтение ОДНОЙ строки вместо содержимого файла (для bash 3 и выше)

Перенаправление вывода ошибок:

2> перенаправить поток ошибок в файл 2>> дописать ошибки в файл (файл будет создан или перезаписан)

Примечание

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

my_var=$(my_ | tee /dev/tty)

Подстановка процессов

Передать процессу команда1 файл (созданный налету канал или файл /dev/fd/…), в котором находятся данные, которые выводит команда2:

команда1 <(команда2)

Примеры

Логировать результат поиска и ошибки:

find . -maxdepth 1 -name ‘*.png’ > ~/ 2> ~/

Эта конструкция позволяет читать из строки как из файла. Демонстрационный пример:

str=’one,two’; tr ‘,’ ‘ ‘ <<<$str

Создаем временный файл и записываем в него поток переданный скрипту:

tmp_file=$(tempfile) # /tmp/fileXXXXXX cat > $tmp_file

А теперь откроем файл в текстовом редакторе с «отвязкой» (отключением) от терминала, подавляем вывод сообщений в терминал:

(sublime-text $tmp_file &) 2> /dev/null > /dev/null