我试图从 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)
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)