Files
z1-lk-bos/script
2024-12-05 17:35:33 +03:00

123 lines
2.9 KiB
Bash

#!/bin/bash
# Обработка аргументов через getopts
LOG_FILE=""
ERR_FILE=""
SHOW_USERS=0
SHOW_PROCESSES=0
SHOW_HELP=0
# Функция отображения справки
display_help() {
echo "Usage: $0 [options]."
echo "Options:"
echo " -u, --users Display a list of users and their home directories"
echo " -p, --processes Display a list of running processes"
echo " -l, --log PATH Redirect output to a specified file"
echo " -e, --errors PATH Redirect error output to a specified file"
echo " -h, --help Show this message and terminate"
}
# Проверка доступности пути
check_path() {
local path="$1"
touch "$path" 2>/dev/null
if [ $? -ne 0 ]; then
echo "Error: Cannot write to $path" >&2
return 1
fi
return 0
}
# Функция для вывода списка пользователей
list_users() {
awk -F: '{print $1, $6}' /etc/passwd | sort
}
# Функция для вывода списка процессов
list_processes() {
ps -eo pid,comm --sort=pid
}
# Ручная обработка аргументов для раннего перенаправления
for ((i = 1; i <= $#; i++)); do
if [[ ${!i} == "-e" ]]; then
next=$((i + 1))
ERR_FILE=${!next}
break
fi
done
# Настройка вывода ошибок
if [[ -n "$ERR_FILE" ]]; then
if ! check_path "$ERR_FILE"; then
exit 1
fi
echo "Redirecting errors to $ERR_FILE" >&2
exec 2>"$ERR_FILE"
fi
# Парсинг аргументов через getopts
while getopts ":hupl:e:" opt; do
case "$opt" in
h)
SHOW_HELP=1
;;
u)
SHOW_USERS=1
;;
p)
SHOW_PROCESSES=1
;;
l)
LOG_FILE="$OPTARG"
;;
e)
ERR_FILE="$OPTARG"
;;
*)
echo "Invalid option: -$OPTARG" >&2
display_help
exit 1
;;
esac
done
# Основная логика
main() {
if [[ $SHOW_HELP -eq 1 ]]; then
display_help
exit 0
fi
# Настройка вывода в лог-файлы
if [[ -n "$LOG_FILE" ]]; then
if ! check_path "$LOG_FILE"; then
exit 1
fi
exec 1>"$LOG_FILE"
fi
# Выполнение запрошенных действий
if [[ $SHOW_USERS -eq 1 && $SHOW_PROCESSES -eq 1 ]]; then
echo "Error: Cannot use both -u and -p options simultaneously." >&2
display_help
exit 1
fi
if [[ $SHOW_USERS -eq 1 ]]; then
echo "USER HOME"
list_users
elif [[ $SHOW_PROCESSES -eq 1 ]]; then
list_processes
else
echo "Error: No action specified." >&2
display_help
exit 1
fi
}
# Вызов основной функции
main