Fix problems

This commit is contained in:
gandc 2024-12-04 04:12:31 +03:00
parent caf1bb8d32
commit e4454f77c2
Signed by: gandc
GPG Key ID: 9F77B03D43C42CB4

138
script
View File

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