• 【Bash】记录一个长命令换行的BUG


    假设现在我要在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

    由于这个命令太长了,有这样一些问题:1. 改起来不方便,2. 没法存档,3. 不方便在之前命令的基础上修改后并行跑模型。

    于是,很自然想到,把这个命令写在run.sh文件中,然后每次只需要如下命令就可以跑了:

    bash ./run.sh
    
    • 1

    所以,这个长命令可以写成这样一个 带换行 的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
    
    • 1
    • 2
    • 3
    • 4

    接下来,就是我踩坑的地方了!

    1. 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
      
      • 1
      • 2
      • 3
      • 4
      于是,报错:识别不到最后一行的参数了。
    2. 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
      
      • 1
      • 2
      • 3
      • 4
      于是,相当于最后一行参数就被独立出去了,也没法传进程序了。

    当然,还有一种混合的错误写法(第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
    
    • 1
    • 2
    • 3
    • 4

    显然错误!

    最后,小结一句:在用bash写长命令时,可以分行,但是分行要带换行符 \,并且不要随意用注释,会导致后面的参数无法传入。实在不会的话,在bash里放不换行的长命令就行。

  • 相关阅读:
    【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题
    字节码进阶之javassist字节码操作类库详解
    微服务简介
    增长黑客营销方式
    springboot系列(七):如何通过mybatis-plus实现接口增删改查|超级详细,建议收藏
    朋友圈大佬都去读研了,这份备考书单我码住了
    【尚硅谷 Vue学习笔记】P14事件处理 P13事件修饰符 p16键盘事件 p17事件总结
    Git错误解决:如何处理“could not determine hash algorithm“问题
    前端系统设计个人总结
    Maven setting配置文件
  • 原文地址:https://blog.csdn.net/qq_16763983/article/details/134014995