场景解析

我在使用Windows批处理(cmd/bat)过程中遇到了单条命令过长的问题.
为了使脚本书写工整,需要将单条执行的命令跨行书写.如下面代码:

echo Hello Code World

现在我想将CodeWorld切分到第二行和第三行时,需要在前两行的行末添加尖括号^.
注意尖括号后面不能有其他字符(包括空格),否则不生效
如果添加了其他字符的话,尖括号前面的空格会被打印出来.

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,powershellbash脚本语言中的转义字符.

在所有脚本语言中,都会有一些控制字符,它们无法像普通字符一样可以直接被表示出来.比如最常见的换行符制表符等等.

为了能够将它们表示出来,所有编程语言中都会设置转义字符来对那些无法直接表示的字符进行处理.

比如换行符:
  • cmd中的表示方式为^n,
  • 而在powershell中的表示方式为`n;
  • bash中的表示方式为 \n

那么我们的转义字符放在每行的行尾(后面不能有其他字符包括换行符)又可以表示什么意思呢?

转义字符放在行尾表示转义换行符

这里我们以bash举例

我们可以通过转义字符\n来表示换行符,同时我们也可以使用回车键表示换行符,通过回车键表示的换行符如果不加设置的话其实是无法直接显示的,但是会表现为文本的换行.

如果我们不希望终端解析通过回车键实现的换行符为其本身的意思的话,则需要在每一行的行尾也就是换行符之前添加转义字符来转义换行符,转义后的换行符不再表示为换行的意思,而是退化成为了一个普通的空白字符.

换行符在终端解释器中会被解析为命令的结束,但是如果在添加了转义字符后,原本的换行符不再表示其命令结束的 含义,而是退化为了一个空白字符,这里的空白字符不能认为它和空格的作用是一样的.

使用价值分析

其实这段解析本身用处并不大,我们在生活中也不会到处用到单条命令的跨行书写问题,本身有强迫症,希望能够书写工整的脚本语言的同学应该是个福音吧.

参考资料

Split long commands in multiple lines through Windows batch file

bat单条命令跨多行