Большинство популярных команд bash на самом деле являются небольшими подмножествами других доступных команд.
Создатели многих наиболее распространенных командных утилит попытались устранить излишнее печатание, используя сокращения (как, например, ls вместо list, cd вместо change-directory), однако это не повсеместно. Кроме того, часто командам необходимы опции.
К счастью, bash позволяет создавать пользовательские сокращения – алиасы команд. Данное руководство научит использовать команду alias и продемонстрирует несколько полезных примеров алиасов.
Добавление алиаса команды
Добавить алиас команды очень просто.
Алиасы будут оставаться действительными в течение сессии оболочки; для этого нужно просто ввести алиас в командную строку. Базовый синтаксис имеет такой вид:
alias alias_name="command_to_run"
Важно! Между знаком равенства и соседними элементами нет пробелов. С пробелами эта команда не сработает.
Попробуйте создать простой алиас какой-нибудь распространённой команды. К примеру, многие часто используют ls -lha или ls –lhA. Создайте для неё алиас ll:
alias ll="ls -lhA"
Теперь при помощи команды ll можно получить листинг каталога в расширенном формате, включая скрытые каталоги:
ll
-rw-r--r-- 1 root root 3.0K Mar 20 18:03 .bash_history
-rw-r--r-- 1 root root 3.1K Apr 19 2012 .bashrc
drwx------ 2 root root 4.0K Oct 24 14:45 .cache
drwx------ 2 root root 4.0K Mar 20 18:00 .gnupg
-rw-r--r-- 1 root root 0 Oct 24 17:03 .mysql_history
-rw-r--r-- 1 root root 140 Apr 19 2012 .profile
drwx------ 2 root root 4.0K Oct 24 14:21 .ssh
-rw------- 1 root root 3.5K Mar 20 17:24 .viminfo
Чтобы удалить алиас, используйте команду unalias:
unalias ll
Чтобы просмотреть все добавленные алиасы, запустите команду alias без аргументов:
alias
Можно временно обойти алиас; к примеру, команда ls –a сокращена до ls. В таком случае обойти этот алиас можно при помощи:
\ls
При этом будет выполнена обычная команда без опций.
Созданный ранее алиас ll будет доступен только в текущей сессии оболочки. Если открыть новый терминал, в нём алиас действовать не будет.
Все алиасы можно сделать постоянными. Для этого их нужно добавить в один из файлов, которые читаются при запуске сессии (~/.bashrc или ~/.bash_profile). Откройте файл:
nano ~/.bashrc
Алиас нужно добавить в конец файла. Также вы можете добавить комментарий и создать специальный раздел для хранения алиасов:
#########
# Aliases
#########
alias ll="ls -lhA"
Возможно, этот алиас или его варианты уже находятся в этом файле. Многие дистрибутивы поставляются с набором стандартных конфигурационных файлов bash, которые уже содержат список самых распространённых алиасов.
Сохраните и закройте файл. Все добавленные в файл алиасы будут доступны в новой сессии. Чтобы активировать внесённые в файл изменения в текущей сессии, bash может перечитать конфигурационные файлы:
source ~/.bashrc
Примеры алиасов
Теперь вы знаете, как создавать пользовательские алиасы. Рассмотрим наиболее популярные и полезные алиасы. Некоторые из них можно найти в интернете, а некоторые могут быть включены в конфигурации bash по умолчанию.
Навигация и листинг
Ранее мы рассмотрели один пример команды ls. Но существует множество других алиасов этой команды.
Чтобы команда ls возвращала вывод в столбцах и с индикатором типа файла, используйте:
alias ls="ls -CF"
Можно также предупредить некоторые опечатки и создать алиас, который будет вызывать правильную команду:
alias sl="ls"
Создайте алиас, который будет передавать вывод в less для просмотра объемного листинга каталога:
alias lsl="ls -lhFA | less"
Теперь рассмотрим несколько полезных вариантов команды cd.
Этот алиас вернёт в родительский каталог:
alias cd..="cd .."
Установив этот алиас, вы сможете легко находить файлы в текущем каталоге:
alias fhere="find . -name "
Системные алиасы
Также полезными бывают алиасы для мониторинга и запроса статистики системы. Следующий алиас показывает использование дискового пространства в удобном для чтения формате (включая тип файловой системы) и выводит итог в конце:
alias df="df -Tha --total"
Также можно создать алиас для вывода du:
alias du="du -ach | sort -h"
Попробуйте сделать вывод команды free более удобным для восприятия:
alias free="free -mt"
Также можно настроить таблицу процессов. Настройте стандартный вывод:
alias ps="ps auxf"
Чтобы настроить в таблице процессов возможности поиска, нужно создать алиас, который будет искать процесс, указанный как аргумент:
alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"
Теперь при вызове таблицы можно задавать имя процесса. Команда вернёт компактный и удобный вывод:
psg bash
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1001 5227 0.0 0.0 26320 3376 pts/0 Ss 16:29 0:00 bash
Другие алиасы
С командой mkdir часто используется опция –р, которая создаёт все необходимые родительские каталоги. Можно создать алиас для команды с этой опцией:
alias mkdir="mkdir -p"
Можно также добавить флаг –v, который будет сообщать о добавлении новых каталогов. Это позволяет вовремя заметить опечатку, ставшую причиной создания ненужной ветки каталогов.
alias mkdir="mkdir -pv"
Во время загрузки файлов из интернета при помощи wget используется опция –c, которая возобновляет загрузку в случае возникновения ошибки. Алиас для такой команды:
alias wget="wget -c"
Можно также ускорить поиск по истории:
alias histg="history | grep"
Некоторые системные инструменты можно обновить до более современной версии при помощи алиасов; в таком слчае нужно установить обе версии инструмента. Однако имейте в виду: это может отразиться на работе некоторых алиасов.
Следующий алиас заменяет команду top её расширенной версией, которая поддерживает сортировку, поиск и просмотр.
alias top="htop"
Аналогично можно настроить команду ncdu, которая выводит размеры файлов и каталогов в интерактивном режиме и позволяет просматривать файлы и выполнять простые действия:
alias du="ncdu"
Существует также усовершенствованная версия команды df – pydf. Она возвращает информацию в цвете. Чтобы создать её алиас:
alias df="pydf"
Чтобы быстро найти свой внешний IP, создайте алиас:
alias myip="curl http://ipecho.net/plain; echo"
Если вы предпочитаете оптимизировать изображения, используйте пакет ImageMagick. Чтобы установить его, введите:
sudo apt-get install imagemagick
Для оптимизации изображений используется команда mogrify. Чтобы создать алиас для неё, введите:
alias webify="mogrify -resize 690\> *.png"
Такой алиас изменит размер всех изображений PNG в текущем каталоге, чья ширина превышает 690px.
Чтобы потом подгрузить изображения на сервер, можно создать алиас для команды sftp:
alias upload="sftp username@server.com:/path/to/upload/directory
Функции bash
Алиасы просты в использовании, но их возможности всё же весьма ограничены. Иногда, соединяя команды в цепочки, невозможно получить доступ к необходимым аргументам. Кроме того, алиасы считываются после функций, потому они могут работать медленно.
Более надёжной альтернативой алиасов являются функции bash. Они представляют собой что-то между алиасом и полноценным скриптом. Работают они почти так же, как алиасы, но они более гибкие и принимают стандартный ввод.
Данное руководство рассматривает основные функции.
Существует два основных синтаксиса функций bash. Первый использует команду function:
function function_name {
command1
command2
}
Второй вариант – использование скобок:
function_name () {
command1
command2
}
Второй вариант синтаксиса функции можно сжать в одну строку при помощи точки с запятой:
function_name () { command1; command2; }
Важно! Точку с запятой нужно поставить также и в конце последней команды.
Для примера можно создать очень полезную функцию, которая создаёт каталог и сразу открывает его.
mcd () {
mkdir -p $1
cd $1
}
Использовать эту функцию можно так:
mcd test
pwd
/home/demouser/test
Также существует очень полезная функция extract. Она объединяет много утилит для распаковки сжатого файла в любом формате. Есть целый ряд вариантов её использования. Вот один из них:
function extract {
if [ -z "$1" ]; then
# display usage if no parameters given
echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
else
if [ -f $1 ] ; then
# NAME=${1%.*}
# mkdir $NAME && cd $NAME
case $1 in
*.tar.bz2) tar xvjf ../$1 ;;
*.tar.gz) tar xvzf ../$1 ;;
*.tar.xz) tar xvJf ../$1 ;;
*.lzma) unlzma ../$1 ;;
*.bz2) bunzip2 ../$1 ;;
*.rar) unrar x -ad ../$1 ;;
*.gz) gunzip ../$1 ;;
*.tar) tar xvf ../$1 ;;
*.tbz2) tar xvjf ../$1 ;;
*.tgz) tar xvzf ../$1 ;;
*.zip) unzip ../$1 ;;
*.Z) uncompress ../$1 ;;
*.7z) 7z x ../$1 ;;
*.xz) unxz ../$1 ;;
*.exe) cabextract ../$1 ;;
*) echo "extract: '$1' - unknown archive method" ;;
esac
else
echo "$1 - file does not exist"
fi
fi
}
Эта функция берёт первый аргумент и вызывает соответствующую утилиту (в зависимости от расширения файла).
Заключение
Данное руководство охватывает только основы создания алиасов и функций bash.
Создавать алиасы для команд с потенциально вредоносным поведением крайне не рекомендуется! Даже создав для такой команды более безопасный алиас, вы можете случайно нанести системе непоправимый ущерб.
Чтобы выбрать команды, для которых необходимо создать алиасы, изучите историю команд системы.
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
1 247 24.7% cd
2 112 11.2% vim
3 90 9% exit
4 72 7.2% ls
5 70 7% xset
6 56 5.6% apt-get
7 40 4% vlc
8 40 4% rm
9 38 3.8% screen
10 27 2.7% htop