Поиск по сайту:

Введение в полезные псевдонимы и функции Bash


Введение

Чем больше вы работаете с командной строкой, тем больше вы обнаружите, что большинство используемых вами команд являются очень небольшим подмножеством доступных команд. Большинство задач являются привычными, и вы можете выполнять их одинаково каждый день.

В то время как создатели многих наиболее распространенных командных утилит пытались устранить посторонний ввод с помощью сокращенных имен (подумайте, сколько нажатий клавиш вы экономите ежедневно, набирая \ls вместо \list и \cd вместо\change-directory), они не вездесущи. Кроме того, многие люди всегда запускают команды с одними и теми же параметрами каждый раз.

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

Как объявить псевдоним Bash

Объявление псевдонимов в bash очень просто. Это так просто, что вы должны попробовать это прямо сейчас.

Вы можете объявить псевдонимы, которые будут действовать в течение всего сеанса оболочки, просто введя их в командную строку. Синтаксис выглядит следующим образом:

  1. alias alias_name="command_to_run"

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

Теперь давайте создадим общий псевдоним bash. Одна идиоматическая командная фраза, которую часто используют многие люди, это 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 для ls -a), мы можем ввести:

\ls

Это вызовет обычную команду, найденную в нашем пути, без использования версии с псевдонимом.

Предполагая, что вы не отключили его, псевдоним ll будет доступен на протяжении всего текущего сеанса оболочки, но когда вы откроете новое окно терминала, он будет недоступен.

Чтобы сделать это постоянным, нам нужно добавить это в один из различных файлов, которые считываются при запуске сеанса оболочки. Популярными вариантами являются ~/.bashrc и ~/.bash_profile. Нам просто нужно открыть файл и добавить туда псевдоним:

nano ~/.bashrc

Внизу или где хотите, добавьте псевдоним, который вы добавили в командной строке. Не стесняйтесь добавить комментарий, объявляющий целый раздел, посвященный псевдонимам bash:

#########
# Aliases
#########

alias ll="ls -lhA"

Этот псевдоним или его вариант уже может быть в вашем файле. Многие дистрибутивы поставляются с набором стандартных файлов конфигурации bash с несколькими полезными псевдонимами.

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

source ~/.bashrc

Примеры псевдонимов

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

Навигация и листинг

Многие из самых простых команд Linux более полезны, когда вы применяете форматирование и параметры.

Мы рассмотрели один пример ls выше, но есть и много других, которые вы можете найти.

Сделать так, чтобы ls отображался в столбцах и с индикатором типа файла (каталоги заканчивались символом \/, и т. д.) по умолчанию:

alias ls="ls -CF"

Мы также можем предвидеть некоторые опечатки, чтобы вызвать правильную команду:

alias sl="ls"

Давайте также создадим псевдоним для передачи нашего вывода в less для просмотра больших списков каталогов в длинном формате:

alias lsl="ls -lhFA | less"

Как насчет того, чтобы отклониться от ls и попробовать несколько полезных команд для cd.

Этот изменится на ваш родительский каталог, даже если вы забудете пробел:

alias cd..="cd .."

Вы также можете полностью вырезать часть cd, создав псевдоним для ..:

alias ..="cd .."

Мы можем легко найти файлы в нашем текущем каталоге, установив этот псевдоним:

alias fhere="find . -name "

Системные псевдонимы

Как насчет некоторых наших команд мониторинга и системной статистики? Я каждый раз вызываю их с одними и теми же параметрами, так что я мог бы сделать несколько псевдонимов.

В нем будет указано использование нашего диска в удобочитаемых единицах, включая тип файловой системы, и напечатан итог внизу:

alias df="df -Tha --total"

Мы могли бы также добавить псевдоним для нашего предпочтительного вывода du:

alias du="du -ach | sort -h"

Давайте продолжим двигаться в том же направлении, сделав наш бесплатный вывод более удобным для человека:

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, который мы часто используем, является флаг -p для создания любых необходимых родительских каталогов. Мы можем сделать это по умолчанию:

alias mkdir="mkdir -p"

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

alias mkdir="mkdir -pv"

При загрузке файлов из Интернета с помощью wget почти во всех случаях вам потребуется передать флаг -c, чтобы продолжить загрузку в случае возникновения проблем. Мы можем установить это следующим образом:

alias wget="wget -c"

Мы можем легко искать нашу историю, например, с помощью grep вывода команды history. Иногда это более полезно, чем использование CTRL-R для обратного поиска, потому что это дает вам номер команды для последующего выполнения более сложных отзывов:

alias histg="history | grep"

У меня есть несколько системных инструментов, которые я предпочитаю обновлять со стандартной версии до более сложных инструментов. Они будут работать только в том случае, если вы загрузили необходимые утилиты, но они могут быть очень полезными. Имейте в виду, что это может повлиять на другие ваши псевдонимы.

Эта команда заменяет обычную команду top улучшенной версией, которая намного приятнее для глаз и может без затруднений сортироваться, искать и прокручиваться:

alias top="htop"

Аналогичным образом можно загрузить команду ncdu, которая представляет размеры файлов и каталогов в интерактивном отображении ncurses, которое вы можете просматривать и использовать для выполнения простых действий с файлами:

alias du="ncdu"

Также существует обновленная утилита для df, которая называется pydf. Он обеспечивает цветной вывод и текстовые панели использования. Мы можем по умолчанию использовать эту утилиту, если она у нас есть:

alias df="pydf"

Вам когда-нибудь требовался общедоступный IP-адрес из командной строки, когда вы находитесь за маршрутизатором, использующим NAT? Что-то вроде этого может быть полезно:

alias myip="curl http://ipecho.net/plain; echo"

Для моих собственных целей мне нравится оптимизировать изображения, которые я загружаю для статей, до 690 пикселей или меньше, поэтому я использую пакет ImageMagick (sudo apt-get install imagemagick, если он еще не доступен), который содержит команду называется mogrify, который делает именно это. У меня есть эта команда в моем файле ~/.bashrc:

alias webify="mogrify -resize 690\> *.png"

Это изменит размер всех изображений PNG в текущем каталоге, только если они шире 690 пикселей.

Если затем мне нужно загрузить их на сервер, я могу использовать sftp для подключения и автоматического перехода в определенный каталог:

  1. alias upload="sftp username@server.com</^>:/path/to/upload/directory<^>

Начало работы с функциями Bash

Хотя псевдонимы быстро и легко реализуются, их возможности весьма ограничены. Вы обнаружите, что, пытаясь объединить команды в цепочку, вы, среди прочего, не можете очень хорошо получить доступ к аргументам, заданным во время выполнения. Псевдонимы также могут иногда работать довольно медленно, потому что они считываются после всех функций.

Существует более надежная альтернатива псевдонимам, которая может помочь вам преодолеть разрыв между псевдонимами bash и полноценными сценариями оболочки. Они называются функциями оболочки. Они работают почти так же, как псевдонимы, но являются более программными и принимают ввод стандартным образом.

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

Для начала есть два основных способа объявить синтаксис bash. Первый использует команду function и выглядит примерно так:

  1. function function_name {
  2. command1
  3. <^>command2</^>
  4. }

Другой синтаксис использует набор круглых скобок, который больше похож на C:

  1. function_name () {
  2. command1
  3. command2
  4. }

Мы можем сжать эту вторую форму в одну строку и разделить команды точкой с запятой. Точка с запятой должна стоять и после последней команды:

  1. function_name () { command1; command2; }

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

mcd () {
    mkdir -p $1
    cd $1
}

Теперь, когда мы используем эту функцию вместо обычной команды mkdir для автоматического перехода в каталог после создания:

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>"
    echo "       extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"
    return 1
 else
    for n in $@
    do
      if [ -f "$n" ] ; then
          case "${n%,}" in
            *.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar) 
                         tar xvf "$n"       ;;
            *.lzma)      unlzma ./"$n"      ;;
            *.bz2)       bunzip2 ./"$n"     ;;
            *.rar)       unrar x -ad ./"$n" ;;
            *.gz)        gunzip ./"$n"      ;;
            *.zip)       unzip ./"$n"       ;;
            *.z)         uncompress ./"$n"  ;;
            *.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)
                         7z x ./"$n"        ;;
            *.xz)        unxz ./"$n"        ;;
            *.exe)       cabextract ./"$n"  ;;
            *)
                         echo "extract: '$n' - unknown archive method"
                         return 1
                         ;;
          esac
      else
          echo "'$n' - file does not exist"
          return 1
      fi
    done
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

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

Джастин Эллингвуд