shell中长命令的换行处理方法示例
前言
考察下面的脚本:
emcc-o./dist/test.html--shell-file./tmp.html--source-map-basedist-O3-g4--source-map-basedist-sMODULARIZE=1-s"EXPORT_NAME=\"Test\""-sUSE_SDL=2-sLEGACY_GL_EMULATION=1--pre-js./pre.js--post-js./post.js--cpuprofiler--memoryprofiler--threadprofilermain.cpp
这里在调用emcc进行WebAssembly编译时,组织了很多参数。整个命令都在一行之中,不是很好阅读和维护。
换行
可通过加\的方式来进行换行拆分。
改造后看起来像这样,一个参数占一行:
emcc-o./dist/test.html\ --shell-file./tmp.html\ --source-map-basedist\ -O3\ -g4\ --source-map-basedist\ -sMODULARIZE=1\ -s"EXPORT_NAME=\"Test\""\ -sUSE_SDL=2\ -sLEGACY_GL_EMULATION=1\ --pre-js./pre.js\ --post-js./post.js\ --cpuprofiler\ --memoryprofiler\ --threadprofiler\ main.cpp
注释
通过\(backslash)换行后,整体阅读体验好了很多。进一步,我们想要为每个参数添加注释,发现不能简单地这样来:
emcc-o./dist/test.html\#目标文件 --shell-file./tmp.html\#模板文件 --source-map-basedist\ -O3\ -g4\ --source-map-basedist\ -sMODULARIZE=1\ -s"EXPORT_NAME=\"Test\""\ -sUSE_SDL=2\ -sLEGACY_GL_EMULATION=1\ --pre-js./pre.js\ --post-js./post.js\ --cpuprofiler\ --memoryprofiler\ --threadprofiler\ main.cpp
这样会导致整个shell脚本解析失败。
实测发现,也不能这样:
emcc-o\ #目标文件 ./dist/test.html\ #模板文件 --shell-file./tmp.html\ --source-map-basedist\ -O3\ -g4\ --source-map-basedist\ -sMODULARIZE=1\ -s"EXPORT_NAME=\"Test\""\ -sUSE_SDL=2\ -sLEGACY_GL_EMULATION=1\ --pre-js./pre.js\ --post-js./post.js\ --cpuprofiler\ --memoryprofiler\ --threadprofiler\ main.cpp
同样会导致解析失败。
说到底,通过\拆分的命令,只是呈现上变成了多行,其中插入的注释是会破坏掉语义的。
但也不是没办法添加注释了,几经周转发现如下写法是可行的:
emcc-o./dist/test.html`#目标文件`\ --shell-file./tmp.html`#模板文件`\ --source-map-basedist`#sourcemap根路径`\ -O3`#优化级别`\ -g4`#生成debug信息`\ --source-map-basedist\ `#-sMODULARIZE=1\` -s"EXPORT_NAME=\"Test\""\ -sUSE_SDL=2\ -sLEGACY_GL_EMULATION=1\ --pre-js./pre.js\ --post-js./post.js\ --cpuprofiler\ --memoryprofiler\ --threadprofiler\ main.cpp
即通过`(backtick)来包裹我们的注释,就不会破坏掉脚本的语义了,能够正确解析执行。
进一步,解决了注释的问题,如果我们不想要某一行,同时又不想删除,可以像下面这样来注释:
emcc-o./dist/test.html`#目标文件`\ --shell-file./tmp.html`#模板文件`\ --source-map-basedist`#sourcemap根路径`\ -O3`#优化级别`\ -g4`#生成debug信息`\ --source-map-basedist\ -sMODULARIZE=1\ -s"EXPORT_NAME=\"Test\""\ -sUSE_SDL=2\ -sLEGACY_GL_EMULATION=1\ `#--pre-js./pre.js`\ --post-js./post.js\ --cpuprofiler\ `#--threadprofiler`\ --memoryprofiler\ main.cpp