使用 {} 和多个 `\ls` 理解复杂的命令替换

ber*_*436 5 shell-script

我试图从 shell 脚本中理解这一行。我知道这$(..)意味着运行..并将其输出插入您$()在语句中找到的位置。但是这些括号之间发生了什么?正在\ls做什么以及这与\之前的行有什么关系?那是\\分成两条线吗?是\ls一样的正规ls

APPCLASSPATH=$CLASSPATH:$({ \
    \ls -1 "$VOLTDB_VOLTDB"/voltdb-*.jar; \
    \ls -1 "$VOLTDB_LIB"/*.jar; \
    \ls -1 "$VOLTDB_LIB"/extension/*.jar; \
} 2> /dev/null | paste -sd ':' - )
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 5

3 个ls命令的输出将传递给将paste它们合并为值的命令:

$VOLTDB_VOLTDB"/voltdb-*.jar:$VOLTDB_LIB"/*.jar:$VOLTDB_LIB"/extension/*.jar
Run Code Online (Sandbox Code Playgroud)

注意:变量$VOLTDB_VOLTDB$VOLTDB_LIB将被扩展,对于这些ls命令中的每一个,可能有多个值而不仅仅是一个文件。看到*那里了吗?这是一个 glob 字符,它充当通配符并扩展到左侧 (voltdb-) 和右侧 (.jar) 之间的任何内容。

这些将匹配:

voltdb-1.jar
voltdb-blah.jar
voltdb-12345.jar
Run Code Online (Sandbox Code Playgroud)

然后所有内容都包含在变量中APPCLASSPATH

APPCLASSPATH=$CLASSPATH:$VOLTDB_VOLTDB"/voltdb....etc.
Run Code Online (Sandbox Code Playgroud)

粘贴命令

这是我使用seq命令生成数字序列 1-10的示例。

$ seq 10 | paste -sd ':' -
1:2:3:4:5:6:7:8:9:10
Run Code Online (Sandbox Code Playgroud)

您可以看到该paste命令正在合并输出并用冒号 ( :)分隔。

您还可以像这样模仿示例命令:

$ { echo "hi1"; echo "hi2"; echo "hi3"; } | paste -sd ':' -
hi1:hi2:hi3
Run Code Online (Sandbox Code Playgroud)

注:-粘贴命令告诉它采取从STDIN输入并打印每个参数,因为它进来,由分离:

使用不同的开关paste也可以根据它后面的-'s的数量将数据分成组。

粘贴示例

这是一个带有 2 的示例-

$ seq 10 | paste - -
1       2
3       4
5       6
7       8
9       10
Run Code Online (Sandbox Code Playgroud)

这是 3-的。

$ seq 10 | paste - - -
1       2       3
4       5       6
7       8       9
10
Run Code Online (Sandbox Code Playgroud)

所以它告诉每行应该打印paste多少个参数paste。但是不要混淆,您正在处理的示例只是从 STDIN 获取输入,在空格上分隔每个参数,然后打印后跟一个:. 当给出多个-'s 时,你告诉你paste接受参数,2 次,一次 3 次,等等。

一次 2 个参数,以:'s分隔:

$ seq 10 | paste -d ':' - -
1:2
3:4
5:6
7:8
9:10

$ seq 10 | paste -d ':' - - -
1:2:3
4:5:6
7:8:9
10::
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您包含-s开关,您将告诉您将paste参数串联(串行)。观察在上述示例之一中使用它时会发生什么。

一次2个:

$ seq 10 | paste -sd ':' - -
1:2:3:4:5:6:7:8:9:10
Run Code Online (Sandbox Code Playgroud)

一次 3 个:

$ seq 10 | paste -sd ':' - - -
1:2:3:4:5:6:7:8:9:10
Run Code Online (Sandbox Code Playgroud)