#!/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 } # Парсинг аргументов через 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 [[ -n "$ERR_FILE" ]]; then if ! check_path "$ERR_FILE"; then exit 1 fi exec 2>"$ERR_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