假设现在我要在terminal执行如下命令跑模型:
CUDA_VISIBLE_DEVICES=6 python finetune.py -c configs/quantized/resnet32_cifar100_finetune.yml --model resnet32 --data-dir ~/datasets --apex-amp --initial-checkpoint /home/zwx/projects/hawq/resnet32.pth.tar --quant-firstlast --wq-per-channel
由于这个命令太长了,有这样一些问题:1. 改起来不方便,2. 没法存档,3. 不方便在之前命令的基础上修改后并行跑模型。
于是,很自然想到,把这个命令写在run.sh文件中,然后每次只需要如下命令就可以跑了:
bash ./run.sh
所以,这个长命令可以写成这样一个 带换行 的sh文件,可读性和可修改性高了很多:
CUDA_VISIBLE_DEVICES=6 python finetune.py -c \
configs/quantized/resnet32_cifar100_finetune.yml --model resnet32 \
--data-dir ~/datasets --apex-amp --initial-checkpoint /home/zwx/projects/hawq/resnet32.pth.tar \
--quant-firstlast --wq-per-channel
接下来,就是我踩坑的地方了!
- Bash中不要随意加注释!
我在改命令时,做了这样一个修改(第3行中留了个之前路径的注释):
于是,报错:识别不到最后一行的参数了。CUDA_VISIBLE_DEVICES=6 python finetune.py -c \ configs/quantized/resnet32_cifar100_finetune.yml --model resnet32 \ --data-dir ~/datasets --apex-amp --initial-checkpoint /home/zwx/projects/hawq/resnet32.pth.tar \ # old file path --quant-firstlast --wq-per-channel
- Bash中换行一定要在行末加换行符 \ !
我在改命令时,做了这样一个修改(删掉了第3行末尾的换行符 \):
于是,相当于最后一行参数就被独立出去了,也没法传进程序了。CUDA_VISIBLE_DEVICES=6 python finetune.py -c \ configs/quantized/resnet32_cifar100_finetune.yml --model resnet32 \ --data-dir ~/datasets --apex-amp --initial-checkpoint /home/zwx/projects/hawq/resnet32.pth.tar --quant-firstlast --wq-per-channel
当然,还有一种混合的错误写法(第3行既没有换行符 \,也多了注释):
CUDA_VISIBLE_DEVICES=6 python finetune.py -c \
configs/quantized/resnet32_cifar100_finetune.yml --model resnet32 \
--data-dir ~/datasets --apex-amp --initial-checkpoint /home/zwx/projects/hawq/resnet32.pth.tar # old file path
--quant-firstlast --wq-per-channel
显然错误!文章来源:https://www.toymoban.com/news/detail-719877.html
最后,小结一句:在用bash写长命令时,可以分行,但是分行要带换行符 \,并且不要随意用注释,会导致后面的参数无法传入。实在不会的话,在bash里放不换行的长命令就行。文章来源地址https://www.toymoban.com/news/detail-719877.html
到了这里,关于【Bash】记录一个长命令换行的BUG的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!