Skip to content

Instantly share code, notes, and snippets.

@cornradio
Created July 2, 2026 13:55
Show Gist options
  • Select an option

  • Save cornradio/334495f54ba31e6c69e006f66357428f to your computer and use it in GitHub Desktop.

Select an option

Save cornradio/334495f54ba31e6c69e006f66357428f to your computer and use it in GitHub Desktop.
Lazy screen 中文版
#!/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