Владислав Андреев - Блог

Наглядный shell: овладеваем Linux, macOS и UNIX shell

Это перевод статьи A Shell Primer: Master Your Linux, OS X, Unix Shell Environment.

Я нашёл силы перенести этот пост из старого блога, но понял, что его структура довольна плоха и тяжела для восприятия (как и в оригинале). Но я надеюсь, что он кому-нибудь будет полезен.

На Linux или Unix-подобных системах каждый пользователь и процесс работают в специальном окружении. Оно включает в себя переменные, настройки, алиасы и функции. Далее будет приведено краткое введение в некоторые полезные команды оболочки с примерами использования и настройки окружения для увеличения удобства работы с командной строкой.

На рисунке изображена связь между различными оболочками командной строки

Разузнаём информацию о текущей оболочке

Введите одну из следующих команд в терминале:

ps $$
# или:
ps -p $$
# или:
echo "$0"

Пример вывода:

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

Узнаём, какие оболочки установлены

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

type -a zsh
type -a ksh
type -a sh
type -a bash

Пример вывода:

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

Файл /etc/shells содержит список оболочек, установленных в системе. Одна строка файла соответствует одной оболочке и содержит путь до неё относительно корня диска. Введите команду cat, чтобы увидеть список оболочек на своей системе:

cat /etc/shells

Пример вывода:

/bin/sh
/bin/dash
/bin/bash
/bin/rbash

Временно меняем оболочку

Для временной смены оболочки просто введите её имя в консоли. Например, изменим оболочку на sh:

sh

Мы только что временно изменили нашу оболочку на sh. Чтобы покинуть её, необходимо нажать Ctrl+D, либо ввести следующую команду:

exit

Узнаем количество оболочек, запущенных внутри друг друга (уровень их вложенности)

Значение переменной $SHLVL увеличивается каждый раз, как запускается новая копия bash. Введите следующую команду:

echo "$SHLVL"

Пример вывода:

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

Изменяем текущую оболочку для всех будующих сеансов с помощью команды chsh

Хотите изменить оболочку с bash на zsh для себя? Введите команду:

chsh -s /bin/zsh

Хотите изменить оболочку другого пользователя с bash на ksh? Введите эту команду:

sudo chsh -s /bin/ksh имя_пользователя

Узнаём конфигурацию окружения

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

env
env | more
env | less
env | grep 'NAME'

Пример вывода (коротко):

SHELL=/bin/bash
TERM=xterm-256color
...
XAUTHORITY=/home/vladyio/.Xauthority
_=/usr/bin/env
Переменная Значение Команда для просмотра значения
BASH_VERSION Текущая версия Bash echo $BASH_VERSION
HOSTNAME Имя хоста echo $HOSTNAME
HISTFILE Имя файла с историей echo $HISTFILE
HISTFILESIZE Размер файла с историей echo $HISTFILESIZE
HISTSIZE Количество команд, сохраняющихся в историю (500 по умолчанию) echo $HISTSIZE
HOME Домашняя директория текущего пользователя echo $HOME
PATH Путь поиска для команд. Это список директорий, разделённых точкой с запятой, которые сканирует оболочка echo $PATH
PS1 Натройки строки ввода echo $PS1
SHELL Путь до оболочки по умолчанию echo $SHELL
EDITOR Текстовый редактор по умолчанию export EDITOR=/usr/bin/vim

Внимание! Будет отличной идеей не изменять следующие переменные окружения, так как после этого они могут остановить работу терминала: SHELL, UID, RANDOM, PWD, PPID, SSH_AUTH_SOCK, USER, HOME, LINENO.

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

Можно использовать одну из следующих команд для отображения значения переменной окружения HOME:

## Используя printenv ##
printenv HOME

## или echo ##
echo "$HOME"

## либо printf для портативности ##
printf "%s\n" "$HOME"

Пример вывода:

/home/vladyio

Добавление и настройка новой переменной

Такой синтаксис работает для оболочек bash, zsh, sh и ksh:

## Синтаксис такой:
VAR=value
FOO=bar

## Установить VIM тектовым редактором по умолчанию
EDITOR=vim
export $EDITOR

## Установить таймаут оболочки для безопасности
TMOUT=300
export TMOUT

## Можно использовать команду export напрямую для настройки переменной PATH
## PATH хранит в себе путь поиска для команд
export PATH=$PATH:$HOME/bin:/usr/local/bin:/path/to/mycoolapps

## И ещё раз повторим способы вывода значений переменных:
printenv PATH
echo "$EDITOR"
printf "%s\n" $TMOUT

Как же изменить уже существующие переменные?

export VAR=value
## ИЛИ ##
VAR=value
export $VAR

## Изменить тектовый редактор с VIM на EMACS ##
echo "$EDITOR" ## --- выведет vim
EDITOR=emacs   ## --- меняем
export $EDITOR ## --- экспортируем для всех сессий
echo "$EDITOR" ## --- выведет emacs

Для tcsh синтаксис следующий:

setenv var value
printenv var


## Установить значение bar для переменной foo ##
setenv foo bar
echo "$foo"
printenv foo

## Изменить переменную PATH ##
setenv PATH $PATH\:$HOME/bin
echo "$PATH"

## изменить переменную PAGER ##
setenv PAGER most
printf "%s\n" $PAGER

Находим конфигурационные файлы оболочки

Введите следующую команду для вывода файлов оболочки:

ls -l ~/.bash* ~/.profile /etc/bash* /etc/profile

Пример вывода:

-rw-r--r-- 1 root    root     2468 Jul  4  2016 /etc/bash.bashrc
-rw-r--r-- 1 root    root       45 Aug 12  2015 /etc/bash_completion
-rw-r--r-- 1 root    root     8058 Jul  4  2016 /etc/bash_preexec
-rw-r--r-- 1 root    root      575 Oct 22  2015 /etc/profile
-rw------- 1 vladyio vladyio 16869 May 28 15:45 /home/vladyio/.bash_history
-rw-r--r-- 1 vladyio vladyio   220 Jan 24 15:22 /home/vladyio/.bash_logout
-rw-rw-r-- 1 vladyio vladyio    51 Mar 11 11:05 /home/vladyio/.bash_profile
-rw-r--r-- 1 vladyio vladyio  5795 May 10 21:46 /home/vladyio/.bashrc
-rw-r--r-- 1 vladyio vladyio   693 Mar 11 10:19 /home/vladyio/.profile

Для просмотра всех конфигурационных файлов оболочки введите:

less ~/.bash* ~/.profile /etc/bash* /etc/profile

Вы можете отредактировать конфигурационные файлы один за одним используя текстовый редактор:

vim ~/.bashrc

Чтобы отредактировать файлы в /etc/, введите:

## сначала сделаем резервную копию... На всякий случай :)
sudo cp -v /etc/bashrc /etc/bashrc.bak.28052017

## Теперь точно можно веселиться. Отредактируем /etc/bashrc:
sudo vim /etc/bashrc

Напуганы инициализацией файлов bash?

Следующий граф вам поможет разобраться:

Инициализация файлов bash

Находим файлы конфигурации zsh

В wiki для zsh рекомендуют следующую команду:

strings =zsh | grep zshrc

Пример вывода

/etc/zshrc
.zshrc

Введите следующую команду, чтобы отобразить все файлы zsh:

ls -l /etc/zsh/* /etc/profile ~/.z*

Чтобы найти все файлы конфигурации zsh, введите

less /etc/zsh/* /etc/profile ~/.z*

Находим файлы конфигурации ksh

Смотрите файл ~/.profile или /etc/profile.

Находим файлы конфигурации tcsh

  • Смотрите файл ~/.login, ~/.cshrc для C Shell.
  • Смотрите файл ~/.tcshrc и ~/.cshrc для TC shell.

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

Да, добавьте все команды и алиасы в файлы ~/.bashrc (bash shell) или ~/.profile (sh/ksh/bash) либо ~/.login (csh/tcsh).

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

Да, добавьте все команды и алиасы в файлы ~/.bash_logout (bash) или ~/.logout (csh/tcsh).

История: получаем больше информации

  • Просто введите history для просмотра истории.
  • Введите history 20, чтобы увидеть последние 20 команд из истории.
  • Можно переиспользовать команды. Просто нажимайте клавиши [Вверх] и [Вниз], чтобы просмотреть предыдущие команды. Нажмите Ctrl+R для поиска в обратном порядке по истории. Чтобы повторить последнюю выполненную команду, введите !!.
  • Чтобы выполнить команду №93 из истории, введите !93

Смена профиля с помощью sudo или su

Синтаксис следующий:

su userName

## Войти как пользователь tom ##
su tom

## Чтобы войти как root-пользователь ##
su -

## Синтаксис команды sudo ##
sudo -s
sudo tom

Алиасы

Алиасы это просто напросто сокращения для команд. Для просмотра списка алиасов введите команду alias.

Создание алиасов

Синтаксис для bash/zsh:

alias c='clear'
alias down='sudo /sbin/shutdown -h now'

Функции оболочки

Функции Bash/ksh/zsh позволяют производить дальнейшую кастомизацию вашего окружения. В этом примере напишем простую функцию memcpu(), отображающую первые 10 прожорливых процессов CPU/RAM:

memcpu() { echo "*** Top 10 CPU ***"; ps auxf | sort -nr -k 3 | head -10; \
echo  "*** Top 10 RAM ***"; ps auxf | sort -nr -k 4 | head -10;  }