< Bash (Русский)

Bash (Русский)/Functions (Русский)

Bash также поддерживает функции. Функции можно добавлять напрямую в ~/.bashrc или же в отдельный файл, который затем будет считан и исполнен из ~/.bashrc. Дополнительные примеры можно найти на форуме.

Состояние перевода: На этой странице представлен перевод статьи Bash/Functions. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Отображение кодов ошибок

Создайте trap для перехвата ненулевого (означающего ошибку) кода возврата из последней запущенной программы:

~/.bashrc
EC() {
	echo -e '\e[1;33m'code $?'\e[m\n'
}
trap EC ERR

Компиляция и запуск кода Cи на лету

Представленная ниже функция скомпилирует (в каталоге /tmp/) и запустит файл с исходным кодом на языке Си "на лету" (запуск будет произведен без аргументов). После завершения работы программы скомпилированный файл будет удален.

csource() {
	[[ $1 ]]    || { echo "Missing operand" >&2; return 1; }
	[[ -r $1 ]] || { printf "File %s does not exist or is not readable\n" "$1" >&2; return 1; }
	local output_path=${TMPDIR:-/tmp}/${1##*/};
	gcc "$1" -o "$output_path" && "$output_path";
	rm "$output_path";
	return 0;
}

Извлечение

Следующая функция извлекает данные из архивов различных типов. Запуск производится в виде extract <file1> <file2> ....

extract() {
    local c e i

    (($#)) || return

    for i; do
        c=''
        e=1

        if [[ ! -r $i ]]; then
            echo "$0: file is unreadable: \`$i'" >&2
            continue
        fi

        case $i in
            *.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz)))))
                   c=(bsdtar xvf);;
            *.7z)  c=(7z x);;
            *.Z)   c=(uncompress);;
            *.bz2) c=(bunzip2);;
            *.exe) c=(cabextract);;
            *.gz)  c=(gunzip);;
            *.rar) c=(unrar x);;
            *.xz)  c=(unxz);;
            *.zip) c=(unzip);;
            *.zst) c=(unzstd);;
            *)     echo "$0: unrecognized file extension: \`$i'" >&2
                   continue;;
        esac

        command "${c[@]}" "$i"
        ((e = e || $?))
    done
    return "$e"
}
Примечание: Убедитесь, что опция extglob включена: shopt -s extglob. Для удобства можно добавить эту команду в ~/.bashrc. Подробнее см. gregswiki:glob#Options which change globbing behavior.

То же самое можно сделать с помощью специальных пакетов, см. Archiving and compression tools#Convenience tools.

cd и ls одной командой

Очень часто после смены каталога пользователь запускает ls, чтобы просмотреть его содержимое. Есть определённый смысл объединить cd и ls с помощью функции. Функция будет называться cl (change list) и станет выдавать сообщение об ошибке, если выбранный каталог не существует.

Команду ls можно модифицировать, например .

Простой планировщик задач

По мотивам #Простая записная книжка.

Калькулятор

calc() {
    echo "scale=3;$@" | bc -l
}

Kingbash

Kingbash — автодополнение на основе меню (см. BBS#101010).

Установите пакет kingbash-gb-gitAUR из AUR, после чего добавьте следующий код в ~/.bashrc:

function kingbash.fn() {
    echo -n "KingBash> $READLINE_LINE" #Where "KingBash> " looks best if it resembles your PS1, at least in length.
    OUTPUT=$(/usr/bin/kingbash "$(compgen -ab -A function)")
    READLINE_POINT=$(echo "$OUTPUT" | tail -n 1)
    READLINE_LINE=$(echo "$OUTPUT" | head -n -1)
    echo -ne "\r\e[2K"
}
bind -x '"\t":kingbash.fn'

Информация об IP-адресе

Подробная информация об IP-адресе и имени хоста с сайта https://ipinfo.io:

ipif() { 
    if grep -P "(([1-9]\d{0,2})\.){3}(?2)" <<< "$1"; then
	 curl ipinfo.io/"$1"
    else
	ipawk=($(host "$1" | awk '/address/ { print $NF }'))
	curl ipinfo.io/${ipawk[1]}
    fi
    echo
}
gollark: And yep!
gollark: *thumb hurts*
gollark: Pagination first.
gollark: On the other hand God-Emperor TJ09 decreed it okay.
gollark: On the one hand the only rules Kaini says apply are the ones by the box.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.