Created
July 2, 2026 13:55
-
-
Save cornradio/334495f54ba31e6c69e006f66357428f to your computer and use it in GitHub Desktop.
Lazy screen 中文版
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # 检查是否安装了 screen | |
| if ! command -v screen &> /dev/null; then | |
| echo "❌ 错误: 系统未安装 screen,请先安装。" | |
| exit 1 | |
| fi | |
| # 获取当前所有会话并存入数组 | |
| get_screen_list() { | |
| mapfile -t SCREEN_ARRAY < <(screen -ls | grep -E "\((Attached|Detached)\)" | awk '{print $1 " " $2}') | |
| } | |
| show_menu() { | |
| clear | |
| echo "=====================================================" | |
| echo " 🦥 LAZY SCREEN (指令一体化版) " | |
| echo "=====================================================" | |
| echo " 当前后台运行中的会话:" | |
| get_screen_list | |
| if [ ${#SCREEN_ARRAY[@]} -eq 0 ]; then | |
| echo " [暂无活跃的后台会话]" | |
| else | |
| for i in "${!SCREEN_ARRAY[@]}"; do | |
| echo " [$((i+1))] ${SCREEN_ARRAY[$i]}" | |
| done | |
| fi | |
| echo "-----------------------------------------------------=" | |
| echo " [n] 🚀 新建全新会话 (直接输入: n 名字)" | |
| echo " [数字] 🔗 快捷恢复会话 (直接输入: 数字 或 r数字)" | |
| echo " [k数字] 🛑 快捷彻底关闭 (直接输入: k数字)" | |
| echo " [f/r] 🔄 刷新会话列表" | |
| echo " [h] 💡 偷溜快捷键小抄" | |
| echo " [q] ❌ 退出助手" | |
| echo "=====================================================" | |
| echo -n "懒人指令 >> " | |
| } | |
| create_screen() { | |
| local name=$1 | |
| # 如果用户没有输入名字,再提示手动输入 | |
| if [ -z "$name" ]; then | |
| echo "" | |
| read -p "请输入新会话的名字 (例如: web, api): " name | |
| fi | |
| if [ -z "$name" ]; then | |
| echo "❌ 名字不能为空!" | |
| sleep 1 | |
| return | |
| fi | |
| echo "👉 正在创建并进入会话: $name" | |
| echo "💡 提示:进去后想保持后台并溜出来,请按:Ctrl + A,然后按 D" | |
| echo "按任意键进入..." | |
| read -n 1 | |
| screen -S "$name" | |
| } | |
| attach_by_index() { | |
| local idx=$1 | |
| get_screen_list | |
| if [ "$idx" -le "${#SCREEN_ARRAY[@]}" ] && [ "$idx" -gt 0 ]; then | |
| target=$(echo "${SCREEN_ARRAY[$((idx-1))]}" | awk '{print $1}') | |
| screen -r "$target" | |
| else | |
| echo "❌ 找不到编号为 [$idx] 的会话!" | |
| sleep 1 | |
| fi | |
| } | |
| kill_by_index() { | |
| local idx=$1 | |
| get_screen_list | |
| if [ "$idx" -le "${#SCREEN_ARRAY[@]}" ] && [ "$idx" -gt 0 ]; then | |
| target=$(echo "${SCREEN_ARRAY[$((idx-1))]}" | awk '{print $1}') | |
| screen -X -S "$target" quit | |
| echo "✨ 会话 $target 已彻底关闭。" | |
| sleep 1 | |
| else | |
| echo "❌ 找不到编号为 [$idx] 的会话!" | |
| sleep 1 | |
| fi | |
| } | |
| help_tips() { | |
| clear | |
| echo "=========================================" | |
| echo " 💡 LAZY SCREEN 独家小抄" | |
| echo "=========================================" | |
| echo "当你【身处在某个 Screen 会话内部】时:" | |
| echo "" | |
| echo "1. 如何“溜出来”(保持后台运行):" | |
| echo " 👉 先按住 Ctrl + A,放开,再单独按一下 D 键。" | |
| echo "" | |
| echo "2. 如何在里面直接“销毁”这个会话:" | |
| echo " 👉 直接输入 \`exit\` 回车,或者按 Ctrl + D。" | |
| echo "=========================================" | |
| read -p "按回车键返回主菜单..." | |
| } | |
| # 主循环 | |
| while true; do | |
| show_menu | |
| read -r cmd args | |
| # 转换为小写方便匹配 | |
| cmd=$(echo "$cmd" | tr 'A-Z' 'a-z') | |
| case $cmd in | |
| n) | |
| create_screen "$args" | |
| ;; | |
| f|r) | |
| # 只有当纯输入 r 时才是刷新;如果是 r1 这种形式,会走下面的通配符匹配 | |
| if [ -z "$args" ]; then | |
| : # 刷新列表(直接走循环开头) | |
| else | |
| # 处理可能误输入成 "r 1" 的情况 | |
| if [[ "$args" =~ ^[0-9]+$ ]]; then | |
| attach_by_index "$args" | |
| fi | |
| fi | |
| ;; | |
| h) | |
| help_tips | |
| ;; | |
| q) | |
| clear; echo "再见!"; exit 0 | |
| ;; | |
| *) | |
| # 1. 匹配直接输入纯数字 (如: 1) -> 默认恢复该会话 | |
| if [[ "$cmd" =~ ^[0-9]+$ ]]; then | |
| attach_by_index "$cmd" | |
| # 2. 匹配 r+数字 (如: r1, r2) -> 恢复对应会话 | |
| elif [[ "$cmd" =~ ^r([0-9]+)$ ]]; then | |
| idx="${BASH_REMATCH[1]}" | |
| attach_by_index "$idx" | |
| # 3. 匹配 k+数字 (如: k1, k2) -> 杀死对应会话 | |
| elif [[ "$cmd" =~ ^k([0-9]+)$ ]]; then | |
| idx="${BASH_REMATCH[1]}" | |
| kill_by_index "$idx" | |
| else | |
| echo "❌ 指令无法识别,请根据菜单提示输入。"; sleep 1 | |
| fi | |
| ;; | |
| esac | |
| done | |
| EOF | |
| # 赋予权限并移动到全局目录 | |
| chmod +x ~/lscreen | |
| sudo mv ~/lscreen /usr/local/bin/lscreen |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment