Bash (Українська)/Functions (Українська)
Bash також підтримує функції. Додайте функції до ~/.bashrc або окремого файлу, який є sourceом з ~/.bashrc. Більше прикладів функцій Bash можна знайти в BBS#30155.
Відображення кодів помилок
Встановити trap для перехоплення ненульового коду повернення останнього запуску програми:
~/.bashrc
EC() {
echo -e '\e[1;33m'code $?'\e[m\n'
}
trap EC ERR
Компіляція та виконання вихідного коду C на льоту
Наступна функція скомпілює (у каталозі /tmp/) і виконає на льоту аргумент джерела C (причому виконання буде без аргументів). І, нарешті, після завершення роботи програми, вилучить скомпільований файл.
# Compile and execute a C source on the fly
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|zst)))))
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 для виведення його вмісту. Тому корисно мати другу функцію, яка виконує обидві дії одночасно.
У цьому прикладі ми назвемо її cl (список змін) і покажемо повідомлення про помилку, якщо вказаного каталогу не існує..
cl() {
local dir="$1"
local dir="${dir:=$HOME}"
if [[ -d "$dir" ]]; then
cd "$dir" >/dev/null; ls
else
echo "bash: cl: $dir: Directory not found"
fi
}
ls -hall --color=auto.Простий нотатник
note () {
# if file doesn't exist, create it
if [[ ! -f $HOME/.notes ]]; then
touch "$HOME/.notes"
fi
if ! (($#)); then
# no arguments, print file
cat "$HOME/.notes"
elif [[ "$1" == "-c" ]]; then
# clear file
printf "%s" > "$HOME/.notes"
else
# add all arguments to file
printf "%s\n" "$*" >> "$HOME/.notes"
fi
}
Простий планувальник
Натхненний простим нотатником.
todo() {
if [[ ! -f $HOME/.todo ]]; then
touch "$HOME/.todo"
fi
if ! (($#)); then
cat "$HOME/.todo"
elif [[ "$1" == "-l" ]]; then
nl -b a "$HOME/.todo"
elif [[ "$1" == "-c" ]]; then
> $HOME/.todo
elif [[ "$1" == "-r" ]]; then
nl -b a "$HOME/.todo"
eval printf %.0s- '{1..'"${COLUMNS:-$(tput cols)}"\}; echo
read -p "Type a number to remove: " number
sed -i ${number}d $HOME/.todo "$HOME/.todo"
else
printf "%s\n" "$*" >> "$HOME/.todo"
fi
}
Калькулятор
calc() {
echo "scale=3;$@" | bc -l
}
Інформація про IP-адресу
Детальна інформація про IP-адресу або hostname в bash за допомогою 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
}