diff --git a/script b/script index 67d0324..7475c12 100644 --- a/script +++ b/script @@ -1,14 +1,14 @@ #!/bin/bash -list_users() { - awk -F: '{print $1, $6}' /etc/passwd | sort -} +# Обработка аргументов через getopts +LOG_FILE="" +ERR_FILE="" +SHOW_USERS=0 +SHOW_PROCESSES=0 +SHOW_HELP=0 -list_processes() { - ps -eo pid,comm --sort=pid -} - -show_help() { +# Функция отображения справки +display_help() { echo "Usage: $0 [options]." echo "Options:" echo " -u, --users Display a list of users and their home directories" @@ -16,64 +16,96 @@ show_help() { 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 - if [ ! -w "$path" ]; then - echo "Error: No access to write to $path" >&2 - exit 1 + local path="$1" + touch "$path" 2>/dev/null + if [ $? -ne 0 ]; then + echo "Error: Cannot write to $path" >&2 + return 1 fi + return 0 } -log_output() { - local path=$1 - check_path "$path" - exec >"$path" +# Функция для вывода списка пользователей +list_users() { + awk -F: '{print $1, $6}' /etc/passwd | sort } -log_errors() { - local path=$1 - check_path "$path" - exec 2>"$path" +# Функция для вывода списка процессов +list_processes() { + ps -eo pid,comm --sort=pid } -ARGS=$(getopt -o upl:e:h --long users,processes,log:,errors:,help -n "$0" -- "$@") -if [ $? -ne 0 ]; then - echo "Error: Incorrect input" >&2 - exit 1 -fi -eval set -- "$ARGS" - -while true; do - case "$1" in - -u|--users) - list_users - shift +# Парсинг аргументов через getopts +while getopts ":hupl:e:" opt; do + case "$opt" in + h) + SHOW_HELP=1 ;; - -p|--processes) - list_processes - shift + u) + SHOW_USERS=1 ;; - -l|--log) - log_output "$2" - shift 2 + p) + SHOW_PROCESSES=1 ;; - -e|--errors) - log_errors "$2" - shift 2 + l) + LOG_FILE="$OPTARG" ;; - -h|--help) - show_help - exit 0 - ;; - --) - shift - break + e) + ERR_FILE="$OPTARG" ;; *) - echo "Unknown parameter $1" >&2 + 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