Наглядный 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; }