場景解析
我在使用Windows批處理(cmd/bat)過程中遇到了單條命令過長的問題.
爲了使腳本書寫工整,需要將單條執行的命令跨行書寫.如下面代碼:
echo Hello Code World
現在我想將Code
和World
切分到第二行和第三行時,需要在前兩行的行末添加尖括號^
.
注意尖括號後面不能有其他字符(包括空格),否則不生效
如果添加了其他字符的話,尖括號前面的空格會被打印出來.
echo Hello ^
Code ^
World
這時終端會將這三行中的代碼解析爲一行命令並加以執行.
使用示例
下面是我使用mvn
命令生成maven
工程的代碼:
; cmd下單條 Maven 命令跨行書寫
mvn archetype:generate ^
-DgroupId=com.example ^
-DartifactId=hutoolTest ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-DinteractiveMode=false
引申
同理在PowerShell
下要想實現同樣的效果需要用到`反引號.
# powershell 下單條 Maven 命令跨行書寫
mvn archetype:generate `
-DgroupId=com.example `
-DartifactId=hutoolTest `
-DarchetypeArtifactId=maven-archetype-quickstart `
-DinteractiveMode=false
在 Bash
下實現同樣的效果則要用到\反斜槓.
# bash 下單條 Maven 命令跨行書寫
mvn archetype:generate \
-DgroupId=com.example \
-DartifactId=hutoolTest \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
命令跨行書寫 實現原理
之前一直不明白爲什麼通過行尾添加^,`,\可以實現命令的跨行書寫,可能是因爲我的學習開端不是很好吧,一開始就找錯了方向.其實這裏的三個字符分別爲 cmd
,powershell
和bash
腳本語言中的轉義字符.
在所有腳本語言中,都會有一些控制字符,它們無法像普通字符一樣可以直接被表示出來.比如最常見的換行符
和製表符
等等.
爲了能夠將它們表示出來,所有編程語言中都會設置轉義字符
來對那些無法直接表示的字符進行處理.
比如換行符:
- 在
cmd
中的表示方式爲^n, - 而在
powershell
中的表示方式爲`n; - 在
bash
中的表示方式爲 \n
那麼我們的轉義字符放在每行的行尾(後面不能有其他字符包括換行符)又可以表示什麼意思呢?
轉義字符放在行尾表示轉義換行符
這裏我們以bash
舉例
我們可以通過轉義字符\n
來表示換行符,同時我們也可以使用回車鍵
表示換行符,通過回車鍵
表示的換行符如果不加設置的話其實是無法直接顯示的,但是會表現爲文本的換行.
如果我們不希望終端解析通過回車鍵實現的換行符
爲其本身的意思的話,則需要在每一行的行尾也就是換行符
之前添加轉義字符來轉義換行符
,轉義後的換行符
不再表示爲換行的意思,而是退化成爲了一個普通的空白字符.
換行符在終端解釋器中會被解析爲命令的結束,但是如果在添加了轉義字符後,原本的換行符
不再表示其命令結束的 含義,而是退化爲了一個空白字符
,這裏的空白字符不能認爲它和空格的作用是一樣的.
使用價值分析
其實這段解析本身用處並不大,我們在生活中也不會到處用到單條命令的跨行書寫問題,本身有強迫症,希望能夠書寫工整的腳本語言的同學應該是個福音吧.
參考資料
Split long commands in multiple lines through Windows batch file