小bug记录
因为自己手贱修改了一下开源代码中,run.sh脚本文件中的一行命令,导致参数传递失败,特此记录
正确示例
# evaluation.py:
...
# action='store_true'是用于指定参数的解析动作,当脚本中添加该参数时,它的值为True,否则为False。
parser.add_argument('--mask_embedding_sentence', action='store_true')
...
# run.sh:
...
"bert-prompt")
#| STS12 | STS13 | STS14 | STS15 | STS16 | STSBenchmark | SICKRelatedness | Avg. |
#| 60.96 | 73.83 | 62.18 | 71.54 | 68.68 | 70.60 | 67.16 | 67.85 |
EVAL_ONLY=true
CHECKPOINT=./bert-base-uncased/bert-base-uncased
TEMPLATE="*cls*_This_sentence_:_\"*sent_0*\"_means*mask*.*sep+*"
eargs=(--mask_embedding_sentence \
--mask_embedding_sentence_template $TEMPLATE )
;;
...
...
CUDA_VISIBLE_DEVICES=$GPU python evaluation.py \
--model_name_or_path $CHECKPOINT \
--pooler avg\
--mode test\
${eargs[@]}
...
这里给出了一个无bug版本的shell脚本设置。重要的是观察
${eargs[@]}
这个参数列表的传递过程。正确代码在命令行运行如下命令以后,得到的${eargs[@]}
内容如下:
./run.sh bert-prompt
: <<'END'
import sys
print("Received arguments:", sys.argv) # 查看实际传入的参数
Received arguments: ['evaluation.py', '--model_name_or_path', './bert-base-uncased', '--pooler', 'avg', '--mode', 'test', '--mask_embedding_sentence', '--mask_embedding_sentence_template', '*cls*_This_sentence_:_"*sent_0*"_means*mask*.*sep+*']
END
错误示例
这里错误示例的操作是在传递参数
${eargs[@]}
之前,添加了一行带’#'符号的注释,导致参数传递失败
问题原因在于:在 Shell 脚本中,反斜杠 \ 用于将一行命令延续到下一行,但若下一行以 # 开头,则会被视为独立注释行,导致后续内容被忽略
...
CUDA_VISIBLE_DEVICES=$GPU python evaluation.py \
--model_name_or_path $CHECKPOINT \
--pooler avg\
--mode test\
# ${eargs[@]}表示传入脚本的所有参数列表,其中@符号表示所有参数,并将其视为独立的参数。
${eargs[@]}
...
代码在命令行运行如下命令以后,
${eargs[@]}
参数列表丢失了:
./run.sh bert-prompt
# 使用命令打出接收到的参数
: <<'END'
import sys
print("Received arguments:", sys.argv) # 查看实际传入的参数
Received arguments: ['evaluation.py', '--model_name_or_path', './bert-base-uncased', '--pooler', 'avg', '--mode', 'test']
END