shell 中長命令的換行處理


考察下面的腳本:

emcc -o ./dist/test.html --shell-file ./tmp.html --source-map-base dist -O3 -g4 --source-map-base dist -s MODULARIZE=1 -s "EXPORT_NAME=\"Test\"" -s USE_SDL=2 -s LEGACY_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-base dist\
    -O3\
    -g4\
    --source-map-base dist\
    -s MODULARIZE=1\
    -s "EXPORT_NAME=\"Test\""\
    -s USE_SDL=2\
    -s LEGACY_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-base dist\
    -O3\
    -g4\
    --source-map-base dist\
    -s MODULARIZE=1\
    -s "EXPORT_NAME=\"Test\""\
    -s USE_SDL=2\
    -s LEGACY_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-base dist\
    -O3\
    -g4\
    --source-map-base dist\
    -s MODULARIZE=1\
    -s "EXPORT_NAME=\"Test\""\
    -s USE_SDL=2\
    -s LEGACY_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-base dist `# source map 根路徑` \
    -O3 `# 優化級別` \
    -g4 `# 生成 debug 信息` \
    --source-map-base dist\
    `# -s MODULARIZE=1\`
    -s "EXPORT_NAME=\"Test\""\
    -s USE_SDL=2\
    -s LEGACY_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-base dist `# source map 根路徑` \
    -O3 `# 優化級別` \
    -g4 `# 生成 debug 信息` \
    --source-map-base dist\
    -s MODULARIZE=1\
    -s "EXPORT_NAME=\"Test\""\
    -s USE_SDL=2\
    -s LEGACY_GL_EMULATION=1\
    `# --pre-js ./pre.js`\
    --post-js ./post.js\
    --cpuprofiler\
    `# --threadprofiler`\
    --memoryprofiler\
   main.cpp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM