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

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

Настройка репозитория Git

Создайте или войдите в github.com, перейдите в Репозитории и создайте репозиторий Github. В этом примере мы создаем репо под названием bash.

На своем компьютере создайте каталог Repos в своей домашней папке и измените каталог на этот путь. Если вы хотите использовать другое имя файла или местоположение для каталога репозиториев, измените его на этот путь.

mkdir ~/Repos && cd ~/Repos

Внутри вашего каталога Repos git клонируйте репозиторий bash, который вы создали на Github.

git clone https://github.com/<username>/bash.git

Настройте свой .bash_profile

Внутри вашего пользователя .bashrc (находится в вашей домашней папке) добавьте следующие строки:

export REPOS_DIR="${HOME}/Repos"
export BASH_REPO_DIR="${REPOS_DIR}/bash"
if [ -f ${BASH_REPO_DIR}/bashrc.sh ]; then
    . ${BASH_REPO_DIR}/bashrc.sh
fi

Эти строки ссылаются на bashrc.sh, который мы создадим в репозитории bash. Это единственный шаг настройки, который вы должны повторить на всех своих машинах.

Если вы хотите, вы можете установить разные местоположения для вашего каталога Repos на каждой машине. Возможность повторного использования BASH_REPO_DIR практична, потому что вы можете захотеть установить псевдонимы для файлов или скриптов внутри вашего репозитория bash. Они будут работать на каждой машине, если вы повторно используете ${BASH_REPO_DIR} в своих псевдонимах или скриптах.

Настройка конфигурации и функций bash

В репозитории bash создайте файл с именами bashrc.sh, bash_aliases.sh, bash_functions.sh и prompt.sh.

touch ${BASH_REPO_DIR}/bashrc.sh ${BASH_REPO_DIR}/bash_aliases.sh ${BASH_REPO_DIR}/bash_functions.sh ${BASH_REPO_DIR}/prompt.sh

Внутри bashrc.sh добавьте shebang и ссылки на псевдонимы bash, функции bash и файл приглашения:

#!/bin/bash
#
# Configs for bashrc

if [ -f ${BASH_REPO_DIR}/prompt.sh ]; then
    . ${BASH_REPO_DIR}/prompt.sh
fi
if [ -f ${BASH_REPO_DIR}/bash_aliases.sh ]; then
    . ${BASH_REPO_DIR}/bash_aliases.sh
fi    
 
if [ -f ${BASH_REPO_DIR}/bash_functions.sh ]; then
    . ${BASH_REPO_DIR}/bash_functions.sh
fi

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

Внутри bash_aliases.sh добавьте полезные псевдонимы, которые вы хотите повторно использовать на каждой машине, например

#!/bin/bash
#
# Bash aliases

alias get_my_ip="echo $(curl -s ifconfig.me)"

Этот пример представляет собой команду для печати вашего IP-адреса.

В bash_functions.sh добавьте полезные функции, которые вы хотите повторно использовать на каждой машине, например

#!/bin/bash
#
# Bash functions

# System info
get_OS () {
    hostnamectl | grep -Po "^Operating System: \K[^<]+"
}

Этот пример представляет собой функцию, которая напечатает ваш текущий дистрибутив Linux (команда недоступна в MacOS).

Внутри prompt.sh настройте командную строку, например.

#!/bin/bash
#
# Bash prompt

black=0
red=1
green=2
orange=3
blue=4
purple=5
cyan=6
white=7

magenta=211
cyan_mono=117
yellow=222
pink=198

host=$(hostnamectl | grep -Po "^Operating System: \K[^<]+")

user_color=$(tput setaf ${black}; tput setab ${cyan_mono})
host_color=$(tput setaf ${black}; tput setab ${white})
path_color=$(tput setaf ${black}; tput setab ${cyan_mono})
git_branch_color=$(tput setaf ${black}; tput setab ${white})
prompt_color=$(tput setaf ${white})
input_color=$(tput setaf ${cyan_mono})
output_color=$(tput setaf ${white})

if [[ $host == *"Ubuntu"* ]]; then
    user_color=$(tput setaf ${black}; tput setab ${pink})
    path_color=$(tput setaf ${black}; tput setab ${pink})
    input_color=$(tput setaf ${pink})
elif [[ $host == *"Fedora"* ]]; then
    user_color=$(tput setaf ${black}; tput setab ${cyan_mono})
    path_color=$(tput setaf ${black}; tput setab ${cyan_mono})
    input_color=$(tput setaf ${cyan_mono})
fi

reset=$'\e[0m'

branch_icon=$'\u276f'

git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ (\1) /"
}

force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        color_prompt=yes
    else
        color_prompt=
    fi
fi

# \u: the username of the current user.
# \h: the hostname up to the first dot (.) in the Fully-Qualified Domain Name.
# \W: the basename of the current working directory, with $HOME abbreviated with a tilde (~).

if [ "$color_prompt" = yes ]; then
    PS0='\[${output_color}\]\n'
    PS1='\n\[${path_color}\] \w \[${git_branch_color}\]$(git_branch)\[${reset}\] \[${prompt_color}\]${branch_icon}${branch_icon}${branch_icon} \[${input_color}\]'
    PS2='\[${prompt_color}\]${branch_icon} \[${input_color}\]'
else
    PS1='\u@\h:\w\$ '
fi

#Server Prompt
#PS0='\[${output_color}\]\n'
#PS1='\n\[${user_color}\] \u \[${host_color}\] \h \[${path_color}\] \w \[${reset}\] \[${prompt_color}\]${branch_icon} \[${input_color}\]'
#PS2='\[${prompt_color}\]${branch_icon} \[${input_color}\]'

unset color_prompt force_color_prompt

Этот пример адаптирует вашу командную строку.

На запущенной Ubuntu он будет отображать:

В работающей Fedora он будет отображать:

Установите функцию обновления, которая может выполняться в любом дистрибутиве Linux.

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

Внутри вашего bash_functions.sh добавьте следующие строки

# System info

get_OS () {
    hostnamectl | grep -Po "^Operating System: \K[^<]+"
}

# Updates

update () {
    if [[ $(get_OS) == *"Ubuntu"* ]]; then
        sudo echo -e "updating available software\n----"
        sudo apt-get update;
        echo -e "\nupgrading software\n----"
        sudo apt-get upgrade;
        echo -e "\nremoving obsolete dependency software\n----"
        sudo apt-get autoremove --purge;
        echo -e "\nremoving software in local cache\n----"
        sudo apt-get clean;
        echo "Done"
    elif [[ $(get_OS) == *"Fedora"* ]]; then
        sudo echo -e "updating available software\n----"
        sudo dnf upgrade
        echo -e "\nremoving obsolete dependency software\n----"
        sudo dnf autoremove
        echo -e "\nremoving software in local cache\n----"
        sudo dnf clean all
        echo "Done"
    fi
}

В этом примере функция get_OS выполняет hostnamectl и использует grep для захвата части после «Операционная система:». Это выведет ваш дистрибутив и версию Linux. После этого мы устанавливаем функцию обновления, которая использует функцию get_OS, чтобы сопоставить ее с дистрибутивом. В случае Ubuntu мы запускаем обновления и очищаем после с помощью apt-get. В случае Fedora мы запускаем обновления и очищаем их с помощью dnf. Это может быть расширено с другими дистрибутивами.

Установите функцию очистки, которая может выполняться на каждой машине.

Создайте файл tidy.sh в репозитории bash.

touch ${BASH_REPO_DIR}/tidy.sh

Внутри bash_aliases.sh добавьте следующие строки:

#!/bin/bash
#
# Tidy your machine

# General file paths

file_paths=("${HOME}/Desktop/*" "${HOME}/Downloads/*" "${HOME}/Pictures/Screen*")

# Linux-specific file paths

if [ $(uname) == "Linux" ]; then
 file_paths+=("${HOME}/.local/share/Trash/files/*")
fi

# MacOS-specific file paths

if [ $(uname) == "Darwin" ]; then
 file_paths+=("${HOME}/.Trash/*")
fi

# Remove file paths

for file_path in ${file_paths[@]}; do
 rm -rf "${file_path}"
done

В этом примере мы создаем массив общих путей к файлам, которые необходимо очистить. Затем мы добавляем пути к файлам в этот массив в зависимости от типа ОС. Наконец, мы перебираем массив и удаляем (рекурсивно и принудительно) все файлы по этому пути к файлу. Обратите внимание на * после каждого пути к файлу, что гарантирует удаление только дочерних элементов этого каталога.