${@:3} 在 bash 中意味着什么?

zhe*_*ang 2 bash

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)

jhn*_*hnc 5

这是标准参数扩展

${parameter:offset}
${parameter:offset:length}

这称为子串扩展。它从 offset 指定的字符开始扩展到参数值的 length 个字符。如果参数是、下标为或 的@索引数组或关联数组名称,则结果会有所不同,如下所述。如果省略 length,则扩展为参数值的子字符串,从 offset 指定的字符开始,一直延伸到值的末尾。length 和 offset 是算术表达式(参见 Shell 算术)。@*

[...]

如果参数为@,则结果是从 offset 开始的 length 位置参数。负偏移量是相对于大于最大位置参数的值而取的,因此偏移量 -1 计算为最后一个位置参数。如果长度计算结果为小于零的数字,则这是一个扩展错误。

以下示例说明了使用位置参数的子字符串扩展:

$ 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}
Run Code Online (Sandbox Code Playgroud)