shell script中奇怪的符号之${0##*/}

没有检索到摘要

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行sh文件:#!/bin/bash echo -e "\n--> 应用召回流程执行环境准备\n" # 配置环境变量 echo -e "\n====== 配置运行环境 ======" # 项目路径配置 PROJECT_ROOT=$(dirname "$(realpath -s "$0")") VENV_DIR="$PROJECT_ROOT/.venv" SCRIPT_DIR="$PROJECT_ROOT" DATA_DIR="$PROJECT_ROOT/dataset" OUTPUT_DIR="$PROJECT_ROOT/output" CONFIG_FILE="$PROJECT_ROOT/config.py" # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 日期处理(默认为昨天,也可通过参数指定) YESTERDAY=$(date -d "yesterday" +%Y%m%d) if [ ! -z "$1" ]; then YESTERDAY=$1 fi # 输入输出目录 INPUT_DATE_DIR="${INPUT_DATE_PARTITION_KEY}=${YESTERDAY}" OUTPUT_DATE_DIR="${OUTPUT_DATE_PARTITION_KEY}=${YESTERDAY}" USE_EVENT_DATA_DIR="$DATA_DIR/dws_apppromote_app_use_event_dm/$INPUT_DATE_DIR" SAME_THIRD_CLASS_DATA_DIR="$DATA_DIR/dwd_apppromote_app_same_third_class_ds/$INPUT_DATE_DIR" # 创建输出目录 BASELINE_OUTPUT_DIR="$OUTPUT_DIR/baseline_model/$OUTPUT_DATE_DIR" RECALL_MODEL_OUTPUT_DIR="$OUTPUT_DIR/recall_model/$OUTPUT_DATE_DIR" INTEGRATED_OUTPUT_DIR="$OUTPUT_DIR/integrated_results/$OUTPUT_DATE_DIR" FINAL_OUTPUT_DIR="$OUTPUT_DIR/final_results/$OUTPUT_DATE_DIR" mkdir -p "$BASELINE_OUTPUT_DIR" "$RECALL_MODEL_OUTPUT_DIR" "$INTEGRATED_OUTPUT_DIR" "$FINAL_OUTPUT_DIR" # 日志文件 LOG_FILE="$OUTPUT_DIR/pipeline_run_${YESTERDAY}.log" # 函数:记录日志 log() { local level=$1 local message=$2 local timestamp=$(date +"%Y-%m-%d %H:%M:%S") echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE" } # 函数:执行Python脚本 run_python_script() { local script_path=$1 shift local script_args="$@" log "INFO" "开始执行脚本: $script_path $script_args" # 检查脚本是否存在 if [ ! -f "$script_path" ]; then log "ERROR" "脚本不存在: $script_path" return 1 fi # 执行脚本 python "$script_path" $script_args 2>&1 | tee -a "$LOG_FILE" local exit_code=$? if [ $exit_code -ne 0 ]; then log "ERROR" "脚本执行失败: $script_path,退出代码: $exit_code" return $exit_code else log "INFO" "脚本执行成功: $script_path" return 0 fi } # 从config.py中提取配置参数 log "INFO" "从配置文件加载参数: $CONFIG_FILE" extract_config_value() { local param_name=$1 grep "^$param_name\s*=" "$CONFIG_FILE" | awk -F'=' '{print $2}' | tr -d ' "\t\n' } # 提取并设置配置变量 DELIMITER=$(extract_config_value "DELIMITER") CHUNKSIZE=$(extract_config_value "CHUNKSIZE") NUM_WORKERS=$(extract_config_value "NUM_WORKERS") VALIDITY_PERIOD=$(extract_config_value "VALIDITY_PERIOD") INPUT_DATE_PARTITION_KEY=$(extract_config_value "INPUT_DATE_PARTITION_KEY") OUTPUT_DATE_PARTITION_KEY=$(extract_config_value "OUTPUT_DATE_PARTITION_KEY") OUTPUT_HOUR_PARTITION_KEY=$(extract_config_value "OUTPUT_HOUR_PARTITION_KEY") OUTPUT_FILENAME=$(extract_config_value "OUTPUT_FILENAME") log "INFO" "配置参数已加载:" log "INFO" "DELIMITER: $DELIMITER" log "INFO" "CHUNKSIZE: $CHUNKSIZE" log "INFO" "NUM_WORKERS: $NUM_WORKERS" log "INFO" "VALIDITY_PERIOD: $VALIDITY_PERIOD" log "INFO" "INPUT_DATE_PARTITION_KEY: $INPUT_DATE_PARTITION_KEY" log "INFO" "OUTPUT_DATE_PARTITION_KEY: $OUTPUT_DATE_PARTITION_KEY" # 配置自定义环境变量 export HCCL_WHITELIST_DISABLE=1 export HCCL_CONNECT_TIMEOUT=6000 export HCCL_EXEC_TIMEOUT=6000 # log export ASCEND_SLOG_PRINT_TO_STDOUT=0 # 日志打屏, 可选 export ASCEND_GLOBAL_LOG_LEVEL=3 # 日志级别常用 1 INFO级别; 3 ERROR级别 export ASCEND_GLOBAL_EVENT_ENABLE=0 # 默认不使能event日志信息 export ASCEND_LAUNCH_BLOCKING=0 # 默认不开启算子下发同步,影响训练性能; 开启后每执行完一个算子会做一次流同步 echo -e "\n====== 开始执行应用召回流程 ======" # 步骤1: 运行baseline_model.py log "INFO" "===== 步骤1: 运行基线模型 =====" run_python_script "$SCRIPT_DIR/baseline_model.py" \ --app_use_event_data_dir "$USE_EVENT_DATA_DIR" \ --app_same_third_class_data_dir "$SAME_THIRD_CLASS_DATA_DIR" \ --res_output_dir "$BASELINE_OUTPUT_DIR" if [ $? -ne 0 ]; then log "ERROR" "步骤1失败,流程终止" exit 1 fi # 步骤2: 运行recall_model.py log "INFO" "===== 步骤2: 运行召回模型 =====" run_python_script "$SCRIPT_DIR/recall_model.py" \ --app_use_event_data_dir "$USE_EVENT_DATA_DIR" \ --app_same_third_class_data_dir "$SAME_THIRD_CLASS_DATA_DIR" \ --res_output_dir "$RECALL_MODEL_OUTPUT_DIR" if [ $? -ne 0 ]; then log "ERROR" "步骤2失败,流程终止" exit 1 fi # 步骤3: 运行integrate_recall_app.py整合结果 log "INFO" "===== 步骤3: 整合模型结果 =====" run_python_script "$SCRIPT_DIR/integrate_recall_app.py" \ --baseline_model_input "$BASELINE_OUTPUT_DIR" \ --recall_model_input "$RECALL_MODEL_OUTPUT_DIR" \ --output_dir "$INTEGRATED_OUTPUT_DIR" \ --date "$YESTERDAY" if [ $? -ne 0 ]; then log "ERROR" "步骤3失败,流程终止" exit 1 fi # 步骤4: 运行process_output_files.py处理最终输出 log "INFO" "===== 步骤4: 处理最终输出 =====" run_python_script "$SCRIPT_DIR/process_output_files.py" \ --app_use_event_data_dir "$USE_EVENT_DATA_DIR" \ --app_same_third_class_data_dir "$SAME_THIRD_CLASS_DATA_DIR" \ --res_output_dir "$FINAL_OUTPUT_DIR" if [ $? -ne 0 ]; then log "ERROR" "步骤4失败,流程终止" exit 1 fiOUTPUT # 显示最终结果 log "INFO" "===== 流程执行完成 =====" log "INFO" "基线模型输出: $BASELINE_OUTPUT_DIR" log "INFO" "召回模型输出: $RECALL_MODEL_OUTPUT_DIR" log "INFO" "整合结果: $INTEGRATED_OUTPUT_DIR" log "INFO" "最终输出: $FINAL_OUTPUT_DIR" log "INFO" "日志文件: $LOG_FILE" echo -e "\n====== 应用召回流程执行结束 ======" exit 0的时候,运行的时候出现: 35 [2025-06-06 11:21:54] [INFO] 开始执行脚本: /opt/huawei/schedule-train/algorithm/push_use_event_recall/integrate_recall_app.py --baseline_model_input /opt/huawei/schedule-train/algorithm/push_use_event_recall/output/baseline_model/=--OUTPUT_DIR --recall_model_input /opt/huawei/schedule-train/algorithm/push_use_event_recall/output/recall_model/=--OUTPUT_DIR --output_dir /opt/huawei/schedule-train/algorithm/push_use_event_recall/output/integrated_results/=--OUTPUT_DIR --date --OUTPUT_DIR 36 Traceback (most recent call last): 37 File "/opt/huawei/schedule-train/algorithm/push_use_event_recall/integrate_recall_app.py", line 10, in <module> 38 os.rename("/opt/huawei/schedule-train/algorithm/train.config", 39 FileNotFoundError: [Errno 2] No such file or directory: '/opt/huawei/schedule-train/algorithm/train.config' -> '/opt/huawei/schedule-train/algorithm/push_use_event_recall/config.py' 40 [2025-06-06 11:21:55] [INFO] 脚本执行成功: /opt/huawei/schedule-train/algorithm/push_use_event_recall/integrate_recall_app.py 41 [2025-06-06 11:21:55] [INFO] ===== 步骤4: 处理最终输出 ===== 42 [2025-06-06 11:21:55] [INFO] 开始执行脚本: /opt/huawei/schedule-train/algorithm/push_use_event_recall/process_output_files.py --app_use_event_data_dir /opt/huawei/schedule-train/algorithm/push_use_event_recall/dataset/dws_apppromote_app_use_event_dm/=--OUTPUT_DIR --app_same_third_class_data_dir /opt/huawei/schedule-train/algorithm/push_use_event_recall/dataset/dwd_apppromote_app_same_third_class_ds/=--OUTPUT_DIR --res_output_dir /opt/huawei/schedule-train/algorithm/push_use_event_recall/output/final_results/=--OUTPUT_DIR 43 2025-06-06 11:21:55 - __main__ - process_output_files.py:194 - INFO - 脚本启动,命令行参数 (来自utils.parse_args): Namespace(OUTPUT_DIR=None, app_use_event_data_dir='/opt/huawei/schedule-train/algorithm/push_use_event_recall/dataset/dws_apppromote_app_use_event_dm/=--OUTPUT_DIR', app_same_third_class_data_dir='/opt/huawei/schedule-train/algorithm/push_use_event_recall/dataset/dwd_apppromote_app_same_third_class_ds/=--OUTPUT_DIR', model_recall_data_dir=None, res_output_dir='/opt/huawei/schedule-train/algorithm/push_use_event_recall/output/final_results/=--OUTPUT_DIR', recall_output_dir=None) 44 2025-06-06 11:21:55 - __main__ - process_output_files.py:200 - ERROR - 错误: 未能通过 --model_recall_data_dir 获取输入基础路径。请检查任务配置。这样的记录,每一个路径中都有=--OUTPUT_DIR很奇怪,这个=--OUTPUT_DIR不应该出现在每一个路径里面,是文件中的哪里出现了问题?帮我查找
最新发布
06-07
<think>好的,用户现在问的是Linux Shell编程中#@和#*的用法和区别。首先,我需要确认用户提到的这两个符号是否正确,因为在Shell脚本中,常见的参数处理符号$@和$*,而#通常用于注释或获取变量长度。可能用户有拼写错误,或者混淆了符号的用法。 首先,检查常见的Shell参数符号$@和$*都是用来表示所有位置参数的,但它们在引号中的行为不同。$*将参数合并为一个字符串,而$@保留每个参数作为独立的引用。此外,#在变量替换中用于获取字符串长度,比如${#var}。但用户提到的#@和#*并不常见,可能需要进一步验证是否存在这样的用法。 接下来,考虑用户可能的拼写错误。如果用户原本想问的是${@}和${*},或者是$@和$*的区别,那这就是常见的问题。但用户明确提到了#@和#*,所以需要确认是否存在这样的用法。查阅Shell脚本的文档,发现#通常用于注释或变量操作,如${#array[@]}获取数组元素个数,或者${#var}获取变量长度。但单独的#@和#*并不作为特殊符号使用。 可能的另一种情况是,用户可能在某些教程或脚本中看到过类似用法,比如在参数扩展中使用#来删除匹配前缀,例如${var#pattern}。但#@和#*在这种情况下是否有特殊意义呢?比如,${var#@}可能尝试删除以@开头的最短匹配,但通常@在这里并不是模式字符,所以这可能不适用。 另外,考虑到用户可能混淆了符号,比如将${@:1}(表示从第一个参数开始的切片)中的:1误写成#@。或者用户可能遇到了数组相关的操作,比如数组的索引${array[@]}和${array[*]},这里的@和*用于展开数组元素,而#用于获取数组长度,如${#array[@]}。 因此,用户的问题可能存在拼写错误或混淆,正确的对比应该是$@和$*的区别,或者涉及#符号的其他用法。需要进一步分析可能的场景,并给出相应的解释。 总结可能的回答方向:首先指出用户可能存在的拼写错误,解释正确的符号$@和$*的区别,以及#在变量操作中的常见用法,如获取字符串长度或数组元素个数。同时,如果#@和#*确实存在于某些特定上下文,也需要说明,但这种情况较为罕见。 另外,用户提供的引用中提到了Bash脚本和循环的使用,可能与参数处理相关,可以结合这些引用中的例子进行说明,比如在循环中正确处理参数时,使用$@和$*的不同效果。 最后,生成相关问题,帮助用户深入理解参数处理和变量操作的其他方面。</think>在Linux Shell编程中,`#@`和`#*`并不是标准语法或预定义符号,可能是对某些参数扩展或特殊符号的混淆。以下是Shell中相关符号的解析: --- ### 1. **`$@`和`$*`的区别** 这是Shell中处理位置参数的核心语法: - **`$@`**:表示所有位置参数(`$1`, `$2`, ...),**保留参数的独立性**。 示例: ```bash for arg in "$@"; do echo "$arg" done ``` 输入`./script.sh "a b" c`会输出两行:`a b`和`c`[^2]。 - **`$*`**:将所有位置参数合并为**单个字符串**,默认以空格分隔。 示例: ```bash echo "$*" ``` 输入`./script.sh "a b" c`会输出`a b c`。 --- ### 2. **`#`的常见用法** `#`在Shell中主要用于: - **注释**:`#`开头的行是注释。 - **变量截断**: - `${var#pattern}`:从变量值开头**删除最短匹配的模式**。 示例:`var="file.txt"; echo ${var#*.}`输出`txt`。 - `${var##pattern}`:删除最长匹配的模式。 - **获取长度**: - `${#var}`:获取字符串长度。 - `${#array[@]}`:获取数组元素个数。 --- ### 3. **可能的混淆场景** 若在代码中看到类似`#@`或`#*`的用法,可能是: 1. **注释中的特殊标记**(如IDE或脚本内部的约定符号)。 2. **参数扩展的误写**,例如: ```bash ${@:2} # 从第2个参数开始截取 ${*: -1} # 获取最后一个参数 ``` --- ### 示例对比 ```bash # 使用$@正确处理带空格的参数 for arg in "$@"; do echo "[$arg]" done # 使用$*合并参数 combined="$*" echo "$combined" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值