From baac75c1865cbbf5ab3d9426c8c4fe0525f4ba7a Mon Sep 17 00:00:00 2001 From: mikachu2333 Date: Tue, 19 Aug 2025 15:19:53 +0800 Subject: [PATCH 1/2] use `command -v ` --- src/framework/core.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/framework/core.c b/src/framework/core.c index ec6390f8..c1001644 100644 --- a/src/framework/core.c +++ b/src/framework/core.c @@ -339,22 +339,24 @@ query_program_exist (char *check_cmd, char *prog_name, int mode) /** - * @brief 生成用于 '检测一个程序是否存在' 的命令,该内部函数由 chsrc_check_program() 家族调用 + * @brief 生成用于 '检测一个程序是否存在' 的命令,该内部函数由 `chsrc_check_program()` 家族调用 * - * 检查一个程序是否存在时,我们曾经使用 "调用 程序名 --version" 的方式 (即 cmd_to_check_program2()), + * @note Unix 中,`where` 仅在 zsh 中可以使用,sh 和 Bash 中均无法使用,因为其并非二进制程序 + * 所以在 Unix 中,只能使用 `which` 或 `whereis` + * @warning 2025.8.19 部分linux系统没有 `which` 命令,故使用 `command -v` 代替 + * + * @deprecated + * 曾使用 `调用程序名 --version` 的方式 (即 `cmd_to_check_program2()`), * 但是该方式有三个问题: - * + * * 1. 该程序得到直接执行,可能不太安全 (虽然基本不可能) * 2. 有一些程序启动速度太慢,即使只调用 --version,也依旧会花费许多时间,比如 mvn * 3. 有些程序并不支持 --version 选项 (虽然基本不可能) - * - * @note Unix 中,where 仅在 zsh 中可以使用,sh 和 Bash 中均无法使用,因为其并非二进制程序 - * 所以在 Unix 中,只能使用 which 或 whereis */ static char * cmd_to_check_program (char *prog_name) { - char *check_tool = xy_on_windows ? "where " : "which "; + char *check_tool = xy_on_windows ? "where " : "command -v "; char *quiet_cmd = xy_str_to_quietcmd (xy_2strjoin (check_tool, prog_name)); From 54a2404194b5fd65d7cddaa4031779992234020c Mon Sep 17 00:00:00 2001 From: Mikachu2333 Date: Tue, 19 Aug 2025 19:28:44 +0800 Subject: [PATCH 2/2] improve --- src/framework/core.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/framework/core.c b/src/framework/core.c index c1001644..47d44b66 100644 --- a/src/framework/core.c +++ b/src/framework/core.c @@ -339,19 +339,11 @@ query_program_exist (char *check_cmd, char *prog_name, int mode) /** - * @brief 生成用于 '检测一个程序是否存在' 的命令,该内部函数由 `chsrc_check_program()` 家族调用 + * @brief 生成用于 “检测一个程序是否存在” 的命令,该内部函数由 chsrc_check_program() 家族调用 * - * @note Unix 中,`where` 仅在 zsh 中可以使用,sh 和 Bash 中均无法使用,因为其并非二进制程序 - * 所以在 Unix 中,只能使用 `which` 或 `whereis` - * @warning 2025.8.19 部分linux系统没有 `which` 命令,故使用 `command -v` 代替 - * - * @deprecated - * 曾使用 `调用程序名 --version` 的方式 (即 `cmd_to_check_program2()`), - * 但是该方式有三个问题: - * - * 1. 该程序得到直接执行,可能不太安全 (虽然基本不可能) - * 2. 有一些程序启动速度太慢,即使只调用 --version,也依旧会花费许多时间,比如 mvn - * 3. 有些程序并不支持 --version 选项 (虽然基本不可能) + * @note + * 1. Unix 中,where 仅在 zsh 中可以使用,sh 和 Bash 中均无法使用,因为其并非二进制程序 + * 2. 因部分linux系统没有 `which` 和 `whereis` 命令,使用 `command -v` 代替 */ static char * cmd_to_check_program (char *prog_name) @@ -363,7 +355,17 @@ cmd_to_check_program (char *prog_name) return quiet_cmd; } + XY_Deprecate_This("Use cmd_to_check_program() instead") +/** + * @brief 通过 `调用程序名 --version` 的方式检测程序是否存在 + * + * @deprecated 因存在以下三个问题弃用: + * + * 1. 该程序得到直接执行,可能不太安全 (虽然基本不可能) + * 2. 有一些程序启动速度太慢,即使只调用 --version,也依旧会花费许多时间,比如 mvn + * 3. 有些程序并不支持 --version 选项 (虽然基本不可能) + */ static char * cmd_to_check_program2 (char *prog_name) {