Обзор экономящих время псевдонимов и функций, упрощающих создание полезной командной строки Bash.

В моем недавнем сообщении о настройке Ubuntu с использованием сценариев Bash я кратко упомянул о магии .bashrc. Это не совсем правильно, поэтому вот небольшой пост, который предлагает немного более подробную информацию о том, что может делать файл конфигурации Bash.

Моя текущая конфигурация значительно улучшает мой рабочий процесс и избавляет меня от более чем 50% нажатий клавиш, которые мне пришлось бы использовать без нее. Давайте рассмотрим несколько примеров псевдонимов, функций и конфигураций подсказок, которые могут улучшить наш рабочий процесс, помогая нам быть более эффективными с меньшим количеством нажатий клавиш.

Псевдонимы Bash

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

# Always copy contents of directories (r)ecursively and explain (v) what was done
alias cp='cp -rv'

Команда alias определяет строку, которую мы будем вводить, а затем то, до чего эта строка будет расширяться. Мы можем переопределить существующие команды, такие как cp выше. Сама по себе команда cp копирует только файлы, а не каталоги, и выполняет ее незаметно. С этим псевдонимом нам не нужно помнить о передаче этих двух флагов, а также нам не нужно помнить cd или ls в качестве местоположения нашего скопированного файла, чтобы убедиться, что он там есть. Теперь только эти два нажатия клавиш (для c и d) сделают все это за нас.

Вот еще несколько .bashrc псевдонимов для передачи флагов с общими функциями.

# List contents with colors for file types, (A)lmost all hidden files (without . and ..), in (C)olumns, with class indicators (F)
alias ls='ls --color=auto -ACF'
# List contents with colors for file types, (a)ll hidden entries (including . and ..), use (l)ong listing format, with class indicators (F)
alias ll='ls --color=auto -alF'
# Explain (v) what was done when moving a file
alias mv='mv -v'
# Create any non-existent (p)arent directories and explain (v) what was done
alias mkdir='mkdir -pv'
# Always try to (c)ontinue getting a partially-downloaded file
alias wget='wget -c'

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

alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'

Функции Bash

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

# Show contents of the directory after changing to it
function cd () {
  builtin cd "$1"
  ls -ACF
}

Я не могу подсчитать, сколько раз я набирал cd, а затем ls сразу после, чтобы увидеть содержимое каталога, в котором я сейчас нахожусь. Когда эта функция настроена, все это происходит только с этими двумя буквами. Функция принимает первый аргумент $1 в качестве местоположения для перехода в каталог, а затем выводит содержимое этого каталога в красиво отформатированные столбцы с индикаторами типа файла. Часть builtin необходима для того, чтобы Bash позволил нам переопределить эту команду по умолчанию.

Функции Bash также очень полезны, когда дело доходит до загрузки или обновления программного обеспечения. Раньше я тратил хотя бы несколько минут каждые пару недель на загрузку новой расширенной версии генератора статических сайтов Hugo, благодаря отличной частоте доставки. С функцией мне нужно только передать версию, и обновление происходит через несколько секунд.

# Hugo install or upgrade
function gethugo () {
  wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz
  tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/
  sudo mv -f tmp/hugo /usr/local/bin/
  rm -rf tmp/
  hugo version
}

Обозначение $@ просто принимает все указанные аргументы, заменяя свое место в функции. Чтобы запустить указанную выше функцию и загрузить Hugo версии 0.57.2, мы используем команду gethugo 0.57.2.

Для Голанга тоже есть:

function getgolang () {
  sudo rm -rf /usr/local/go
  wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz
  sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz
  rm -rf tmp/
  go version
}

Или как насчет функции, которая добавляет URL-адрес удаленного источника для GitLab в текущий репозиторий?

function glab () {
  git remote set-url origin --add [email protected]:"$@"/"${PWD##*/}".git
  git remote -v
}

С glab username мы можем создать новый origin URL для текущего репозитория Git с нашим username на GitLab.com. При нажатии на новый удаленный URL-адрес автоматически создается новый частный репозиторий GitLab, так что это полезный ярлык для создания резервных копий!

Функции Bash на самом деле ограничены только возможностями написания сценариев, которых практически нет. Если что-то, что мы делаем часто, требует ввода нескольких строк в терминал, мы, вероятно, сможем создать для этого функцию Bash!

Подсказка Bash

Помимо содержимого каталога, также полезно видеть полный путь к каталогу, в котором мы находимся. Приглашение Bash может показать нам этот путь вместе с другой полезной информацией, такой как наша текущая ветка Git. Чтобы сделать его более читабельным, мы можем определить цвета для каждой части приглашения. Вот как мы можем настроить нашу подсказку в .bashrc для этого:

# Colour codes are cumbersome, so let's name them
txtcyn='\[\e[0;96m\]' # Cyan
txtpur='\[\e[0;35m\]' # Purple
txtwht='\[\e[0;37m\]' # White
txtrst='\[\e[0m\]' # Text Reset
# Which (C)olour for what part of the prompt?
pathC="${txtcyn}"
gitC="${txtpur}"
pointerC="${txtwht}"
normalC="${txtrst}"
# Get the name of our branch and put parenthesis around it
gitBranch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
# Build the prompt
export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "

Результат:

~/github/myrepo (master) $

Присвоение названий цветам помогает легко определить, где начинается и заканчивается один цвет и где начинается следующий. Приглашение, которое мы видим в нашем терминале, определяется строкой, следующей за export PS1, причем каждый компонент приглашения установлен с escape-последовательностью. Давайте разберемся с этим:

  • \w отображает текущий рабочий каталог
  • \$(gitBranch) вызывает функцию gitBranch, определенную выше, которая отображает текущую ветку Git,
  • \$ отобразит «$», если вы обычный пользователь или в обычном пользовательском режиме, и «#», если вы находитесь в корневом каталоге.

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

Вот несколько вариантов, которые помещают информацию в центр внимания и могут помочь нам работать более эффективно.

Для тех, кто не любит промедления

Имя пользователя и текущее время в секундах в 24-часовом формате ЧЧ: ММ: СС:

export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 >

Для тех, кто всегда хочет знать, где они находятся

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

export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo
user:

Для минималистов

export PS1=">"
>

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

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

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