• 【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里放不换行的长命令就行。

  • 相关阅读:
    【案例】由coredump引起的思考:程序的加载流程
    向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss
    支持Python的新版vTESTstudio测试用例编写方法大集合(上)
    扬帆牧哲:shopee台湾站点卖什么?
    天猫评价、销量计算逻辑规则再次变更
    看一眼就会的k8s权限管理手把手教学
    关于优先队列的一点细节
    语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、路径覆盖
    zenmap无法运行扫描操作
    [附源码]计算机毕业设计JAVA校园兼职招聘系统
  • 原文地址:https://blog.csdn.net/qq_16763983/article/details/134014995