#!/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 } # Ручная обработка аргументов для раннего перенаправления for ((i = 1; i <= $#; i++)); do if [[ ${!i} == "-e" || ${!i} == "--errors" ]]; 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 # Парсинг аргументов через getopt PARSED=$(getopt -o hupl:e: --long help,users,processes,log:,errors: -- "$@" 2>&1) if [[ $? -ne 0 ]]; then # Если getopt вернул ошибку, перенаправляем её в stderr echo "$PARSED" >&2 display_help exit 1 fi # Преобразование параметров после обработки getopt eval set -- "$PARSED" # Обработка аргументов while true; do case "$1" in -h|--help) SHOW_HELP=1 shift ;; -u|--users) SHOW_USERS=1 shift ;; -p|--processes) SHOW_PROCESSES=1 shift ;; -l|--log) LOG_FILE="$2" shift 2 ;; -e|--errors) ERR_FILE="$2" shift 2 ;; --) shift break ;; *) echo "Invalid option: $1" >&2 display_help exit 1 ;; esac done # Настройка вывода в лог-файлы if [[ -n "$LOG_FILE" ]]; then if ! check_path "$LOG_FILE"; then exit 1 fi exec 1>"$LOG_FILE" fi # Основная логика main() { if [[ $SHOW_HELP -eq 1 ]]; then display_help exit 0 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 } # Функция для вывода списка пользователей list_users() { awk -F: '{print $1, $6}' /etc/passwd | sort } # Функция для вывода списка процессов list_processes() { ps -eo pid,comm --sort=pid } # Вызов основной функции main