Наглядный 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?
Следующий граф вам поможет разобраться:

Находим файлы конфигурации 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; }