Linux 桌面创建自定义快捷方式

以下面的需求为例:

创建一个同时打开 godot 和 vscode/vscodium 到指定游戏开发目录的启动器

假设软件存放目录结构:

Apps
├── Godot_v4.4.1_stable.x86_64 # 可执行文件
└── VSCodium-linux-x64-1.100.33714
    ├── codium # 可执行文件

方法一、直接创建桌面启动器

这种方式只能打开第一个应用,不能同时启动这两个应用

/home/grsx/Apps/VSCodium-linux-x64-1.100.33714/codium & \
/home/grsx/Apps/Godot.x86_64

方法二、创建脚本运行

可以先创建一个 sh 脚本,再用启动器执行

#!/bin/bash
/home/grsx/Apps/VSCodium-linux-x64-1.100.33714/codium & \
/home/grsx/Apps/Godot.x86_64

方法三、创建自定义命令

为了提供通用性,可以创建一个 runapp.sh 脚本,用于从 Apps 文件夹启动指定名称的应用,实现如下效果。

runapp godot & runapp codium 

以下是实现:

点击查看代码
#!/bin/bash
## 1.参数引入
DEFAULT_PATH="/home/grsx/Apps"

## 2.参数检查
# 检查选项
if [ $1 == -p ]; then
	# 检查路径是否存在
	if [ ! -d "$2" ]; then
	    echo "错误: 路径 '$2' 不存在"
	    exit 1
	fi
	path=$2
	shift 2
else
	path=$DEFAULT_PATH
fi

# 检查参数数量
if [ $# -lt 1 ]; then
	echo "用法: $0 [<选项> [参数]] <前缀> [参数]"
fi

## 3.逻辑执行
# 进入目标目录
cd "$path" || exit 1
appName="$1"
shift 1  # 移除前一个参数,剩余参数传递给可执行文件

# 使用正则表达式查找匹配的文件和目录(不区分大小写)
shopt -s nocasematch  # 启用不区分大小写的匹配
matches=()
while IFS= read -r -d $'\0' item; do
    # 提取基本名称(不含路径)
    base_name=$(basename "$item")
    # 使用正则表达式检查是否包含模式(忽略大小写)
    if [[ "$base_name" =~ ${appName} ]]; then
        matches+=("$item")
    fi
done < <(find . -maxdepth 1 -print0)
shopt -u nocasematch  # 恢复默认的大小写敏感设置

# 检查是否找到匹配项
if [ ${#matches[@]} -eq 0 ]; then
    echo "未找到包含 '$appName' 的文件或目录"
    exit 1
fi

# 分离匹配到的目录和文件
dirs=()
files=()
for match in "${matches[@]}"; do
    if [ -d "$match" ]; then
        dirs+=("$match")
    elif [ -f "$match" ]; then
        files+=("$match")
    fi
done

## 4.结果处理
# 处理文件
if [ ${#files[@]} -gt 0 ]; then
    # 按版本号降序排序文件
    sorted_files=($(printf "%s\n" "${files[@]}" | sort -Vr))
    selected_file="${sorted_files[0]}"

    # 确保文件可执行
    if [ ! -x "$selected_file" ]; then
        echo "错误: 文件 '$selected_file' 不可执行"
        exit 1
    fi

    echo "执行文件: $selected_file"
    exec "./$selected_file" "$@"
# 处理目录
elif [ ${#dirs[@]} -gt 0 ]; then
    # 按版本号降序排序目录
    sorted_dirs=($(printf "%s\n" "${dirs[@]}" | sort -Vr))
    selected_dir="${sorted_dirs[0]}"
    cd "$selected_dir" || exit 1
    echo "已进入目录: $(pwd)"

    # 在新目录中重新运行脚本(递归)
    exec "$0" "-p" "$(pwd)" "$appName" "$@"
fi
该脚本实现传入一个参数作为想要启动的 app 的名字,接着在 Apps 文件夹下寻找包含该名字字符串的文件或文件夹。如果找到了文件,则直接执行;如果只找到文件夹,进入该文件夹递归搜索;执行时还可以携带参数。脚本放置在 /usr/local/bin 下,并赋予可执行权限。

最终效果

桌面启动器执行:

godot_codium_dev /home/grsx/Projects/WS-Godot/Modules_War/

脚本 godot_codium_dev.sh 放置在 /usr/local/bin/下:

#!/bin/bash

## 检查参数数量
if [ $# -lt 1 ]; then
    echo "用法: $0 <godot项目所在路径>"
    exit 1
fi

path="${1%/}"

# 检查路径是否存在
if [ ! -d "$path" ]; then
    echo "错误: 路径 '$path' 不存在"
    exit 1
fi

# 同时执行并关闭终端
nohup runapp godot "$path/project.godot" & runapp codium "$path" &
exit

其它用法

得益于分层实现,可以很快地创建一个用来写博客的快捷方式,命令:

runapp codium /home/grsx/Posts/

补充

对于 vscode/vscodium 的不同功能的管理,可以用工作区,也可以用配置文件,可以参考:{TODO}

posted on 2025-06-08 22:18  Grsx  阅读(140)  评论(0)    收藏  举报