这是这条线。
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
我理解分号之前的行,但我不明白分号之后的这一行是如何工作的。可以
after the command(variable assignment)
and then run the command after semi-colon?
那么下面的行会是相同的吗?
variable=`ls -A $1 | grep '[abc]' | ls -1 $1`
谢谢,
答案1
分号只是分隔两个连续的命令。联机帮助页 ( man bash
) 说(在章节中列表):
命令之间用 ; 分隔依次执行
例如下面的内容先运行命令foo
,然后运行命令bar
。
foo; bar
要正确解析您的示例,您首先必须构建它的分层模型:
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
可以分解为 (反引号内的东西)和(反引号内的东西)。variable=
...
ls -A $1 | grep '[abc]'; ls -1 $1
反引号用于获取命令的输出(请参阅命令替换在man bash
);所以你将整体的输出分配ls -A $1 | grep '[abc]'; ls -1 $1
给变量。
替换命令的输出是匹配特定模式(包括隐藏的希尔德斯)的文件列表,附加完整的文件列表(无论可用于什么......)
答案2
不,它们不一样,后者会通过管道grep
进入ls
(这几乎肯定不是您想要的)。分号只是分隔两个不同的命令。
首先,您可能想开始使用更新、更灵活$( ... )
而不是反引号。
以此为例:
$ var=`echo foo; echo bar`
$ echo "$var"
foo
bar
您可以将反引号(或$( ... )
)视为返回在执行它们之间包含的代码期间打印在标准输出上的任何内容。
在您的情况下,它查看一次的输出ls -A $1
,并在其输出中查找包含 、 或 的行a
,b
然后c
打印 的单列输出ls -1 $1
。一般来说这是一个坏主意你不应该解析 ls。