mirror of
https://gitee.com/SuperManito/LinuxMirrors
synced 2025-11-16 06:10:26 +08:00
优化交互打印
This commit is contained in:
@@ -1114,7 +1114,6 @@ function choose_mirrors() {
|
|||||||
|
|
||||||
## 选择使用软件源内网地址
|
## 选择使用软件源内网地址
|
||||||
function choose_use_intranet_address() {
|
function choose_use_intranet_address() {
|
||||||
local ask_text="默认使用软件源的公网地址,是否继续?"
|
|
||||||
local intranet_source
|
local intranet_source
|
||||||
for ((i = 0; i < ${#mirror_list_extranet[@]}; i++)); do
|
for ((i = 0; i < ${#mirror_list_extranet[@]}; i++)); do
|
||||||
if [[ "${SOURCE}" == "${mirror_list_extranet[i]}" ]]; then
|
if [[ "${SOURCE}" == "${mirror_list_extranet[i]}" ]]; then
|
||||||
@@ -1127,14 +1126,14 @@ function choose_mirrors() {
|
|||||||
if [[ -z "${USE_INTRANET_SOURCE}" ]]; then
|
if [[ -z "${USE_INTRANET_SOURCE}" ]]; then
|
||||||
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
||||||
echo ''
|
echo ''
|
||||||
interactive_select_boolean "${BOLD}${ask_text}${PLAIN}"
|
interactive_select_boolean "${BOLD}请选择软件源的网络地址(访问方式):${PLAIN}" "公网" "内网"
|
||||||
if [[ "${_SELECT_RESULT}" == "false" ]]; then
|
if [[ "${_SELECT_RESULT}" == "false" ]]; then
|
||||||
SOURCE="${intranet_source}"
|
SOURCE="${intranet_source}"
|
||||||
ONLY_HTTP="true" # 强制使用 HTTP 协议
|
ONLY_HTTP="true" # 强制使用 HTTP 协议
|
||||||
[[ "${PURE_MODE}" != "true" ]] && echo -e "\n$WARN 已切换至内网专用地址,仅限在特定环境下使用!"
|
[[ "${PURE_MODE}" != "true" ]] && echo -e "\n$WARN 已切换至内网专用地址,仅限在特定环境下使用!"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
local CHOICE="$(echo -e "\n${BOLD}└─ ${ask_text} [Y/n] ${PLAIN}")"
|
local CHOICE="$(echo -e "\n${BOLD}└─ 默认使用软件源的公网地址,是否继续? [Y/n] ${PLAIN}")"
|
||||||
read -rp "${CHOICE}" INPUT
|
read -rp "${CHOICE}" INPUT
|
||||||
[[ -z "${INPUT}" ]] && INPUT=Y
|
[[ -z "${INPUT}" ]] && INPUT=Y
|
||||||
case "${INPUT}" in
|
case "${INPUT}" in
|
||||||
@@ -1233,17 +1232,16 @@ function choose_protocol() {
|
|||||||
if [[ "${ONLY_HTTP}" == "true" ]]; then
|
if [[ "${ONLY_HTTP}" == "true" ]]; then
|
||||||
WEB_PROTOCOL="http"
|
WEB_PROTOCOL="http"
|
||||||
else
|
else
|
||||||
local ask_text="软件源是否使用 HTTP 协议?"
|
|
||||||
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
||||||
echo ''
|
echo ''
|
||||||
interactive_select_boolean "${BOLD}${ask_text}${PLAIN}"
|
interactive_select_boolean "${BOLD}请选择软件源协议:${PLAIN}" "HTTP" "HTTPS"
|
||||||
if [[ "${_SELECT_RESULT}" == "true" ]]; then
|
if [[ "${_SELECT_RESULT}" == "true" ]]; then
|
||||||
WEB_PROTOCOL="http"
|
WEB_PROTOCOL="http"
|
||||||
else
|
else
|
||||||
WEB_PROTOCOL="https"
|
WEB_PROTOCOL="https"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
local CHOICE="$(echo -e "\n${BOLD}└─ ${ask_text} [Y/n] ${PLAIN}")"
|
local CHOICE="$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}")"
|
||||||
read -rp "${CHOICE}" INPUT
|
read -rp "${CHOICE}" INPUT
|
||||||
[[ -z "${INPUT}" ]] && INPUT=Y
|
[[ -z "${INPUT}" ]] && INPUT=Y
|
||||||
case "${INPUT}" in
|
case "${INPUT}" in
|
||||||
@@ -1823,13 +1821,13 @@ function change_mirrors_main() {
|
|||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo -e "\n$SUCCESS 软件源更换完毕"
|
echo -e "\n$SUCCESS 软件源更换完毕"
|
||||||
else
|
else
|
||||||
echo -e "\n$FAIL 软件源更换完毕,但${SYNC_MIRROR_TEXT}失败\n"
|
echo -e "\n$FAIL 软件源更换完毕,但${SYNC_MIRROR_TEXT}失败"
|
||||||
echo -e "请再次执行脚本并更换相同软件源后进行尝试,若仍然${SYNC_MIRROR_TEXT}失败那么可能由以下原因导致:\n"
|
echo -e "\n$TIP 请再次执行脚本并更换相同软件源后进行尝试,若仍然${SYNC_MIRROR_TEXT}失败那么可能由以下原因导致:"
|
||||||
echo -e "1. 网络连通性问题:例如连接异常、由地区影响的网络间歇式中断、禁止外部访问、软件源网站防火墙阻断等\n"
|
echo -e "\n1. 网络连通性问题:例如连接异常、由地区影响的网络间歇式中断、禁止外部访问、软件源网站防火墙阻断等"
|
||||||
echo -e "2. 目标软件源异常:请手动前往软件源(镜像站)地址进行验证:${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH}\n"
|
echo -e "2. 目标软件源异常:请手动前往软件源(镜像站)地址进行验证:${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH}"
|
||||||
echo -e " 若报错内容是提示某个文件不存在那么有可能是软件源的问题,多常见于正在同步中的软件源仓库"
|
echo -e " 若报错内容是提示某个文件不存在那么有可能是软件源的问题,多常见于正在同步中的软件源仓库"
|
||||||
echo -e " 若报错内容是目录(path)不存在也有可能是目标软件源不存在当前系统镜像仓库,即不支持当前系统"
|
echo -e " 若报错内容是目录(path)不存在也有可能是目标软件源不存在当前系统镜像仓库,即不支持当前系统"
|
||||||
echo -e " 建议更换其它镜像站进行尝试,少数情况下软件源若处于同步中状态则可能会出现文件同步错误问题\n"
|
echo -e " 建议更换其它镜像站进行尝试,少数情况下软件源若处于同步中状态则可能会出现文件同步错误问题"
|
||||||
echo -e "3. 原有软件源报错:请先排除系统原有的其它软件源报错,因为脚本不会干预这些无关的软件源配置,解决后重新运行脚本即可\n"
|
echo -e "3. 原有软件源报错:请先排除系统原有的其它软件源报错,因为脚本不会干预这些无关的软件源配置,解决后重新运行脚本即可\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -3092,13 +3090,15 @@ function interactive_select_boolean() {
|
|||||||
_SELECT_RESULT=""
|
_SELECT_RESULT=""
|
||||||
local selected=0
|
local selected=0
|
||||||
local message="$1"
|
local message="$1"
|
||||||
|
local positive_title="${2:-是}"
|
||||||
|
local negative_title="${3:-否}"
|
||||||
local menu_height=3
|
local menu_height=3
|
||||||
local original_line
|
local original_line
|
||||||
function store_position() {
|
function store_position() {
|
||||||
original_line=$(tput lines 2>/dev/null)
|
original_line=$(tput lines 2>/dev/null)
|
||||||
}
|
}
|
||||||
function clear_menu() {
|
function clear_menu() {
|
||||||
for ((i = 0; i < ${menu_height}; i++)); do
|
for ((i = 0; i < $menu_height; i++)); do
|
||||||
tput cuu1 2>/dev/null
|
tput cuu1 2>/dev/null
|
||||||
tput el 2>/dev/null
|
tput el 2>/dev/null
|
||||||
done
|
done
|
||||||
@@ -3113,9 +3113,9 @@ function interactive_select_boolean() {
|
|||||||
echo -e "╭─ ${message}"
|
echo -e "╭─ ${message}"
|
||||||
echo -e "│"
|
echo -e "│"
|
||||||
if [ "$selected" -eq 0 ]; then
|
if [ "$selected" -eq 0 ]; then
|
||||||
echo -e "╰─ \033[34m●\033[0m 是\033[2m / ○ 否\033[0m"
|
echo -e "╰─ \033[34m●\033[0m ${positive_title}\033[2m / ○ ${negative_title}\033[0m"
|
||||||
else
|
else
|
||||||
echo -e "╰─ \033[2m○ 是 / \033[0m\033[34m●\033[0m 否"
|
echo -e "╰─ \033[2m○ ${positive_title} / \033[0m\033[34m●\033[0m ${negative_title}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
function read_key() {
|
function read_key() {
|
||||||
@@ -3157,10 +3157,10 @@ function interactive_select_boolean() {
|
|||||||
echo -e "╭─ ${message}"
|
echo -e "╭─ ${message}"
|
||||||
echo -e "│"
|
echo -e "│"
|
||||||
if [ "$selected" -eq 0 ]; then
|
if [ "$selected" -eq 0 ]; then
|
||||||
echo -e "╰─ \033[32m●\033[0m \033[1m是\033[0m\033[2m / ○ 否\033[0m"
|
echo -e "╰─ \033[32m●\033[0m \033[1m${positive_title}\033[0m\033[2m / ○ ${negative_title}\033[0m"
|
||||||
_SELECT_RESULT="true"
|
_SELECT_RESULT="true"
|
||||||
else
|
else
|
||||||
echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m \033[1m否\033[0m"
|
echo -e "╰─ \033[2m○ ${positive_title} / \033[0m\033[32m●\033[0m \033[1m${negative_title}\033[0m"
|
||||||
_SELECT_RESULT="false"
|
_SELECT_RESULT="false"
|
||||||
fi
|
fi
|
||||||
tput cnorm 2>/dev/null
|
tput cnorm 2>/dev/null
|
||||||
|
|||||||
@@ -700,7 +700,6 @@ function choose_mirrors() {
|
|||||||
|
|
||||||
## 选择使用软件源内网地址
|
## 选择使用软件源内网地址
|
||||||
function choose_use_intranet_address() {
|
function choose_use_intranet_address() {
|
||||||
local ask_text="默认使用软件源的公网地址,是否继续?"
|
|
||||||
local intranet_source
|
local intranet_source
|
||||||
for ((i = 0; i < ${#mirror_list_extranet[@]}; i++)); do
|
for ((i = 0; i < ${#mirror_list_extranet[@]}; i++)); do
|
||||||
if [[ "${SOURCE}" == "${mirror_list_extranet[i]}" ]]; then
|
if [[ "${SOURCE}" == "${mirror_list_extranet[i]}" ]]; then
|
||||||
@@ -713,14 +712,14 @@ function choose_mirrors() {
|
|||||||
if [[ -z "${USE_INTRANET_SOURCE}" ]]; then
|
if [[ -z "${USE_INTRANET_SOURCE}" ]]; then
|
||||||
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
||||||
echo ''
|
echo ''
|
||||||
interactive_select_boolean "${BOLD}${ask_text}${PLAIN}"
|
interactive_select_boolean "${BOLD}请选择软件源的网络地址(访问方式):${PLAIN}" "公网" "内网"
|
||||||
if [[ "${_SELECT_RESULT}" == "false" ]]; then
|
if [[ "${_SELECT_RESULT}" == "false" ]]; then
|
||||||
SOURCE="${intranet_source}"
|
SOURCE="${intranet_source}"
|
||||||
ONLY_HTTP="true" # 强制使用 HTTP 协议
|
ONLY_HTTP="true" # 强制使用 HTTP 协议
|
||||||
[[ "${PURE_MODE}" != "true" ]] && echo -e "\n$WARN 已切换至内网专用地址,仅限在特定环境下使用!"
|
[[ "${PURE_MODE}" != "true" ]] && echo -e "\n$WARN 已切换至内网专用地址,仅限在特定环境下使用!"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
local CHOICE="$(echo -e "\n${BOLD}└─ ${ask_text} [Y/n] ${PLAIN}")"
|
local CHOICE="$(echo -e "\n${BOLD}└─ 默认使用软件源的公网地址,是否继续? [Y/n] ${PLAIN}")"
|
||||||
read -rp "${CHOICE}" INPUT
|
read -rp "${CHOICE}" INPUT
|
||||||
[[ -z "${INPUT}" ]] && INPUT=Y
|
[[ -z "${INPUT}" ]] && INPUT=Y
|
||||||
case "${INPUT}" in
|
case "${INPUT}" in
|
||||||
@@ -827,17 +826,16 @@ function choose_protocol() {
|
|||||||
if [[ "${ONLY_HTTP}" == "true" ]]; then
|
if [[ "${ONLY_HTTP}" == "true" ]]; then
|
||||||
WEB_PROTOCOL="http"
|
WEB_PROTOCOL="http"
|
||||||
else
|
else
|
||||||
local ask_text="软件源是否使用 HTTP 协议?"
|
|
||||||
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
||||||
echo ''
|
echo ''
|
||||||
interactive_select_boolean "${BOLD}${ask_text}${PLAIN}"
|
interactive_select_boolean "${BOLD}请选择 Docker CE 软件源协议:${PLAIN}" "HTTP" "HTTPS"
|
||||||
if [[ "${_SELECT_RESULT}" == "true" ]]; then
|
if [[ "${_SELECT_RESULT}" == "true" ]]; then
|
||||||
WEB_PROTOCOL="http"
|
WEB_PROTOCOL="http"
|
||||||
else
|
else
|
||||||
WEB_PROTOCOL="https"
|
WEB_PROTOCOL="https"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
local CHOICE="$(echo -e "\n${BOLD}└─ ${ask_text} [Y/n] ${PLAIN}")"
|
local CHOICE="$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}")"
|
||||||
read -rp "${CHOICE}" INPUT
|
read -rp "${CHOICE}" INPUT
|
||||||
[[ -z "${INPUT}" ]] && INPUT=Y
|
[[ -z "${INPUT}" ]] && INPUT=Y
|
||||||
case "${INPUT}" in
|
case "${INPUT}" in
|
||||||
@@ -932,11 +930,10 @@ function install_dependency_packages() {
|
|||||||
echo ''
|
echo ''
|
||||||
animate_exec "${exec_cmd}" "${SYNC_MIRROR_TEXT}"
|
animate_exec "${exec_cmd}" "${SYNC_MIRROR_TEXT}"
|
||||||
else
|
else
|
||||||
echo -e "\n$WORKING ${SYNC_MIRROR_TEXT}...\n"
|
echo ''
|
||||||
for cmd in "${commands[@]}"; do
|
for cmd in "${commands[@]}"; do
|
||||||
eval "${cmd}"
|
eval "${cmd}"
|
||||||
done
|
done
|
||||||
echo -e "\n$COMPLETE ${SYNC_MIRROR_TEXT}结束\n"
|
|
||||||
fi
|
fi
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
output_error "${SYNC_MIRROR_TEXT}出错,请先解决系统原有软件源错误以确保 ${BLUE}${package_manager}${PLAIN} 软件包管理工具可用!"
|
output_error "${SYNC_MIRROR_TEXT}出错,请先解决系统原有软件源错误以确保 ${BLUE}${package_manager}${PLAIN} 软件包管理工具可用!"
|
||||||
@@ -1100,7 +1097,6 @@ function configure_docker_ce_mirror() {
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
echo ''
|
|
||||||
if [[ "${PURE_MODE}" == "true" ]]; then
|
if [[ "${PURE_MODE}" == "true" ]]; then
|
||||||
local exec_cmd=""
|
local exec_cmd=""
|
||||||
for cmd in "${commands[@]}"; do
|
for cmd in "${commands[@]}"; do
|
||||||
@@ -1110,6 +1106,7 @@ function configure_docker_ce_mirror() {
|
|||||||
exec_cmd="${exec_cmd} ; ${cmd}"
|
exec_cmd="${exec_cmd} ; ${cmd}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
echo ''
|
||||||
animate_exec "${exec_cmd}" "${SYNC_MIRROR_TEXT}"
|
animate_exec "${exec_cmd}" "${SYNC_MIRROR_TEXT}"
|
||||||
else
|
else
|
||||||
for cmd in "${commands[@]}"; do
|
for cmd in "${commands[@]}"; do
|
||||||
@@ -1276,7 +1273,7 @@ function install_docker_engine() {
|
|||||||
|
|
||||||
## 判断是否手动选择安装版本
|
## 判断是否手动选择安装版本
|
||||||
if [[ -z "${INSTALL_LATESTED_DOCKER}" ]]; then
|
if [[ -z "${INSTALL_LATESTED_DOCKER}" ]]; then
|
||||||
local ask_text="是否安装最新版本的 Docker Engine ?"
|
local ask_text="Docker Engine 是否安装最新版本?"
|
||||||
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
|
||||||
echo ''
|
echo ''
|
||||||
interactive_select_boolean "${BOLD}${ask_text}${PLAIN}"
|
interactive_select_boolean "${BOLD}${ask_text}${PLAIN}"
|
||||||
@@ -1445,11 +1442,10 @@ function only_change_docker_registry_mirror() {
|
|||||||
echo ''
|
echo ''
|
||||||
animate_exec "${exec_cmd}" "${SYNC_MIRROR_TEXT}"
|
animate_exec "${exec_cmd}" "${SYNC_MIRROR_TEXT}"
|
||||||
else
|
else
|
||||||
echo -e "\n$WORKING ${SYNC_MIRROR_TEXT}...\n"
|
echo ''
|
||||||
for cmd in "${commands[@]}"; do
|
for cmd in "${commands[@]}"; do
|
||||||
eval "${cmd}"
|
eval "${cmd}"
|
||||||
done
|
done
|
||||||
echo -e "\n$COMPLETE ${SYNC_MIRROR_TEXT}结束\n"
|
|
||||||
fi
|
fi
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
output_error "${SYNC_MIRROR_TEXT}出错,请先解决系统原有软件源错误以确保 ${BLUE}${package_manager}${PLAIN} 软件包管理工具可用!"
|
output_error "${SYNC_MIRROR_TEXT}出错,请先解决系统原有软件源错误以确保 ${BLUE}${package_manager}${PLAIN} 软件包管理工具可用!"
|
||||||
@@ -1481,7 +1477,7 @@ function only_change_docker_registry_mirror() {
|
|||||||
function check_installed_result() {
|
function check_installed_result() {
|
||||||
if command_exists docker; then
|
if command_exists docker; then
|
||||||
systemctl enable --now docker >/dev/null 2>&1
|
systemctl enable --now docker >/dev/null 2>&1
|
||||||
echo -en "\n当前安装版本:"
|
echo -en "\n$COMPLETE "
|
||||||
docker -v
|
docker -v
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo -e " $(docker compose version 2>&1)"
|
echo -e " $(docker compose version 2>&1)"
|
||||||
@@ -1631,13 +1627,15 @@ function interactive_select_boolean() {
|
|||||||
_SELECT_RESULT=""
|
_SELECT_RESULT=""
|
||||||
local selected=0
|
local selected=0
|
||||||
local message="$1"
|
local message="$1"
|
||||||
|
local positive_title="${2:-是}"
|
||||||
|
local negative_title="${3:-否}"
|
||||||
local menu_height=3
|
local menu_height=3
|
||||||
local original_line
|
local original_line
|
||||||
function store_position() {
|
function store_position() {
|
||||||
original_line=$(tput lines 2>/dev/null)
|
original_line=$(tput lines 2>/dev/null)
|
||||||
}
|
}
|
||||||
function clear_menu() {
|
function clear_menu() {
|
||||||
for ((i = 0; i < ${menu_height}; i++)); do
|
for ((i = 0; i < $menu_height; i++)); do
|
||||||
tput cuu1 2>/dev/null
|
tput cuu1 2>/dev/null
|
||||||
tput el 2>/dev/null
|
tput el 2>/dev/null
|
||||||
done
|
done
|
||||||
@@ -1652,9 +1650,9 @@ function interactive_select_boolean() {
|
|||||||
echo -e "╭─ ${message}"
|
echo -e "╭─ ${message}"
|
||||||
echo -e "│"
|
echo -e "│"
|
||||||
if [ "$selected" -eq 0 ]; then
|
if [ "$selected" -eq 0 ]; then
|
||||||
echo -e "╰─ \033[34m●\033[0m 是\033[2m / ○ 否\033[0m"
|
echo -e "╰─ \033[34m●\033[0m ${positive_title}\033[2m / ○ ${negative_title}\033[0m"
|
||||||
else
|
else
|
||||||
echo -e "╰─ \033[2m○ 是 / \033[0m\033[34m●\033[0m 否"
|
echo -e "╰─ \033[2m○ ${positive_title} / \033[0m\033[34m●\033[0m ${negative_title}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
function read_key() {
|
function read_key() {
|
||||||
@@ -1696,10 +1694,10 @@ function interactive_select_boolean() {
|
|||||||
echo -e "╭─ ${message}"
|
echo -e "╭─ ${message}"
|
||||||
echo -e "│"
|
echo -e "│"
|
||||||
if [ "$selected" -eq 0 ]; then
|
if [ "$selected" -eq 0 ]; then
|
||||||
echo -e "╰─ \033[32m●\033[0m \033[1m是\033[0m\033[2m / ○ 否\033[0m"
|
echo -e "╰─ \033[32m●\033[0m \033[1m${positive_title}\033[0m\033[2m / ○ ${negative_title}\033[0m"
|
||||||
_SELECT_RESULT="true"
|
_SELECT_RESULT="true"
|
||||||
else
|
else
|
||||||
echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m \033[1m否\033[0m"
|
echo -e "╰─ \033[2m○ ${positive_title} / \033[0m\033[32m●\033[0m \033[1m${negative_title}\033[0m"
|
||||||
_SELECT_RESULT="false"
|
_SELECT_RESULT="false"
|
||||||
fi
|
fi
|
||||||
tput cnorm 2>/dev/null
|
tput cnorm 2>/dev/null
|
||||||
|
|||||||
Reference in New Issue
Block a user