Shell
13. Shell 选项
该 shell 基于 Spring Shell 项目构建。 一些命令行选项来自 Spring Shell,一些特定于 Data Flow。 shell 采用以下命令行选项:
unix:>java -jar spring-cloud-dataflow-shell-2.8.3.jar --help
Data Flow Options:
--dataflow.uri= Address of the Data Flow Server [default: http://localhost:9393].
--dataflow.username= Username of the Data Flow Server [no default].
--dataflow.password= Password of the Data Flow Server [no default].
--dataflow.credentials-provider-command= Executes an external command which must return an
OAuth Bearer Token (Access Token prefixed with 'Bearer '),
e.g. 'Bearer 12345'), [no default].
--dataflow.skip-ssl-validation= Accept any SSL certificate (even self-signed) [default: no].
--dataflow.proxy.uri= Address of an optional proxy server to use [no default].
--dataflow.proxy.username= Username of the proxy server (if required by proxy server) [no default].
--dataflow.proxy.password= Password of the proxy server (if required by proxy server) [no default].
--spring.shell.historySize= Default size of the shell log file [default: 3000].
--spring.shell.commandFile= Data Flow Shell executes commands read from the file(s) and then exits.
--help This message.
您可以使用spring.shell.commandFile
选项指向包含
所有 shell 命令来部署一个或多个相关的流和任务。
还支持运行多个文件。它们应作为逗号分隔的字符串传递:
--spring.shell.commandFile=file1.txt,file2.txt
在创建一些脚本以帮助自动部署时,此选项非常有用。
此外,以下 shell 命令有助于将复杂脚本模块化为多个独立文件:
dataflow:>script --file <YOUR_AWESOME_SCRIPT>
14. 列出可用命令
打字help
在命令提示符处,给出所有可用命令的列表。
大多数命令用于 Data Flow 功能,但少数命令是通用的。
以下清单显示了help
命令:
! - Allows execution of operating system (OS) commands
clear - Clears the console
cls - Clears the console
date - Displays the local date and time
exit - Exits the shell
http get - Make GET request to http endpoint
http post - POST data to http endpoint
quit - Exits the shell
system properties - Shows the shells properties {JB - restore the apostrophe}
version - Displays shell version
将命令名称添加到help
显示了有关如何调用该命令的其他信息:
dataflow:>help stream create
Keyword: stream create
Description: Create a new stream definition
Keyword: ** default **
Keyword: name
Help: the name to give to the stream
Mandatory: true
Default if specified: '__NULL__'
Default if unspecified: '__NULL__'
Keyword: definition
Help: a stream definition, using the DSL (e.g. "http --port=9000 | hdfs")
Mandatory: true
Default if specified: '__NULL__'
Default if unspecified: '__NULL__'
Keyword: deploy
Help: whether to deploy the stream immediately
Mandatory: false
Default if specified: 'true'
Default if unspecified: 'false'
15. Tab 键补全
您可以通过按TAB
键在前导 .例如,按--
TAB
后stream create --
结果为以下一对建议:
dataflow:>stream create --
stream create --definition stream create --name
如果键入--de
然后按 Tab 键,--definition
扩展。
Tab 键补全也可用于应用程序或任务属性的流或组合任务 DSL 表达式中。您还可以使用TAB
在流 DSL 表达式中获取您可以使用的可用源、处理器或接收器的提示。
16. 空格和引用规则
仅当参数值包含空格或|
字符。下面的示例将 SPEL 表达式(应用于它遇到的任何数据)传递给转换处理器:
transform --expression='new StringBuilder(payload).reverse()'
如果参数值需要嵌入单引号,请使用两个单引号,如下所示:
// Query is: Select * from /Customers where name='Smith'
scan --query='Select * from /Customers where name=''Smith'''
16.1. 引号和转义
有一个基于 Spring Shell 的客户端,它与数据流服务器通信并负责解析 DSL。 反过来,应用程序可能具有依赖于嵌入式语言(例如 Spring 表达式语言)的应用程序属性。
Shell、Data Flow DSL 解析器和 SPEL 具有有关它们如何处理引号以及语法转义如何工作的规则。 当组合在一起时,可能会出现混淆。 本节介绍适用的规则,并提供在涉及所有三个组件时可能遇到的最复杂情况的示例。
它并不总是那么复杂
如果不使用数据流 Shell(例如,如果直接使用 REST API),或者应用程序属性不是 SPEL 表达式,则转义规则会更简单。 |
16.1.1. Shell 规则
可以说,当涉及到报价时,最复杂的组件是 Shell。不过,规则可以非常简单地列出:
-
shell 命令由键 (
--something
) 和相应的值。不过,有一个特殊的无键映射,稍后将介绍。 -
值通常不能包含空格,因为空格是命令的默认分隔符。
-
不过,可以通过用引号(单 () 或双 () 引号)将值括起来添加空格。
'
"
-
在部署属性中传递的值(例如
deployment <stream-name> --properties " …"
) 不应再次引用。 -
如果用引号括起来,则值可以通过在引号前加上反斜杠 () 来嵌入相同类型的文字引号。
\
-
其他转义也可用,例如
\t
,\n
,\r
,\f
和 Unicode 转义,格式为\uxxxx
. -
无键映射以特殊方式处理,因此它不需要引号来包含空格。
例如,shell 支持!
命令执行本机 shell 命令。这!
接受单个 keyless 参数。这就是以下示例有效的原因:
dataflow:>! rm something
这里的论点是整个rm something
string,该字符串按原样传递给底层 shell。
再举一个例子,以下命令是严格等效的,参数值为something
(不含引号):
dataflow:>stream destroy something
dataflow:>stream destroy --name something
dataflow:>stream destroy "something"
dataflow:>stream destroy --name "something"
16.1.2. 属性文件规则
从文件加载属性时,规则会放宽。
-
属性文件(Java 和 YAML)中使用的特殊字符需要转义。例如,应替换为 ,
\
\\
\t
由\\t
等等。 -
对于 Java 属性文件 (
--propertiesFile <FILE_PATH>.properties
),则属性值不应用引号括起来。即使它们包含空格,也不需要它。filter.expression=payload > 5
-
对于 YAML 属性文件 (
--propertiesFile <FILE_PATH>.yaml
),但是,这些值需要用双引号括起来。app: filter: filter: expression: "payload > 5"
16.1.3. DSL 解析规则
在解析器级别(即,在流或任务定义的正文中),规则如下:
-
选项值通常会被解析,直到第一个空格字符为止。
-
但是,它们可以由 Literals 字符串组成,并用单引号或双引号括起来。
-
要嵌入此类引用,请使用所需类型的两个连续引用。
因此,--expression
选项在以下示例中在语义上等效:
filter --expression=payload>5
filter --expression="payload>5"
filter --expression='payload>5'
filter --expression='payload > 5'
可以说,最后一个更具可读性。这要归功于周围的引文。实际表达式为payload > 5
.
现在,假设我们要针对字符串消息进行测试。如果我们想将有效负载与 SPEL 文字字符串进行比较,"something"
,我们可以使用以下内容:
filter --expression=payload=='something' (1)
filter --expression='payload == ''something''' (2)
filter --expression='payload == "something"' (3)
1 | 这之所以有效,是因为没有空格。不过,它不是很清晰。 |
2 | 这使用单引号来保护整个参数。因此,实际的单引号需要加倍。 |
3 | SPEL 可以识别带有单引号或双引号的 String Literals,因此最后一种方法可以说是最具可读性的。 |
请注意,上述示例应在 shell 之外考虑(例如,直接调用 REST API 时)。 在 shell 中输入时,整个流定义本身很可能位于双引号内,这需要转义。然后,整个示例变为以下:
dataflow:>stream create something --definition "http | filter --expression=payload='something' | log"
dataflow:>stream create something --definition "http | filter --expression='payload == ''something''' | log"
dataflow:>stream create something --definition "http | filter --expression='payload == \"something\"' | log"
16.1.4. SPEL 语法和 SPEL 文字
拼图的最后一部分是关于 SpEL 表达式的。 许多应用程序接受要解释为 SPEL 表达式的选项,并且如前所述,String Literals 也以特殊方式处理。规则如下:
-
文本可以括在单引号或双引号中。
-
引号需要加倍才能嵌入文字引号。双引号内的单引号不需要特殊处理,反之亦然。
作为最后一个示例,假设您要使用转换处理器。
此处理器接受expression
选项,它是一个 SPEL 表达式。它将根据传入消息进行评估,默认值为payload
(原封不动地转发消息负载)。
请务必了解以下语句是等效的:
transform --expression=payload
transform --expression='payload'
但是,它们与以下内容(以及它们的变体)不同:
transform --expression="'payload'"
transform --expression='''payload'''
第一个系列的计算结果为消息有效负载,而后一个示例的计算结果为文本字符串payload
.
16.1.5. 把它们放在一起
作为最后一个完整的示例,请考虑如何强制将所有消息转换为字符串文本hello world
,方法是在 Data Flow shell 的上下文中创建流:
dataflow:>stream create something --definition "http | transform --expression='''hello world''' | log" (1) dataflow:>stream create something --definition "http | transform --expression='\"hello world\"' | log" (2) dataflow:>stream create something --definition "http | transform --expression=\"'hello world'\" | log" (2)
1 | 在第一行中,单引号将字符串括起来(在 Data Flow 解析器级别),但它们需要加倍,因为它们位于字符串文本内(由等号后的第一个单引号开头)。 |
2 | 第二行和第三行分别使用单引号和双引号,以在 Data Flow 解析器级别包含整个字符串。因此,可以在字符串中使用另一种 quote。整个事情都在--definition 参数添加到使用双引号的 shell。因此,双引号被转义(在 shell 级别)。 |