场景解析
我在使用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