在dist_train.shmmdetection3d中,最后一行做了什么?${@:3}
我无法理解它的 bash 语法。
#!/usr/bin/env bash
CONFIG=$1
GPUS=$2
NNODES=${NNODES:-1}
NODE_RANK=${NODE_RANK:-0}
PORT=${PORT:-29500}
MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
python -m torch.distributed.launch \
--nnodes=$NNODES \
--node_rank=$NODE_RANK \
--master_addr=$MASTER_ADDR \
--nproc_per_node=$GPUS \
--master_port=$PORT \
$(dirname "$0")/train.py \
$CONFIG \
--seed 0 \
--launcher pytorch ${@:3}
Run Code Online (Sandbox Code Playgroud)
这是标准参数扩展:
${parameter:offset}
${parameter:offset:length}这称为子串扩展。它从 offset 指定的字符开始扩展到参数值的 length 个字符。如果参数是、下标为或 的
@索引数组或关联数组名称,则结果会有所不同,如下所述。如果省略 length,则扩展为参数值的子字符串,从 offset 指定的字符开始,一直延伸到值的末尾。length 和 offset 是算术表达式(参见 Shell 算术)。@*
[...]
如果参数为
@,则结果是从 offset 开始的 length 位置参数。负偏移量是相对于大于最大位置参数的值而取的,因此偏移量 -1 计算为最后一个位置参数。如果长度计算结果为小于零的数字,则这是一个扩展错误。以下示例说明了使用位置参数的子字符串扩展:
Run Code Online (Sandbox Code Playgroud)$ set -- 1 2 3 4 5 6 7 8 9 0 a b c d e f g h $ echo ${@:7} 7 8 9 0 a b c d e f g h $ echo ${@:7:0} $ echo ${@:7:2} 7 8 $ echo ${@:7:-2} bash: -2: substring expression < 0 $ echo ${@: -7:2} b c $ echo ${@:0} ./bash 1 2 3 4 5 6 7 8 9 0 a b c d e f g h $ echo ${@:0:2} ./bash 1 $ echo ${@: -7:0}