我需要将项目添加到项目列表中。我不确定这些术语是否正确。
例子:
假设我位于一个包含 2 个文件“a”和“b”的目录中。如果我通过管道传输ls
到less
我的列表,将有两个项目:“a”和“b”:ls | less
我想将 ls 通过管道传输到 less,但在到达 less 命令之前,我希望将一个项目添加到列表中。例如:
ls -->unknow shell feature<-- less
less 列出的内容将是“a”、“b”和“c”(文件“c”不存在)
是否可以?
答案1
最简单的是
(ls;echo c) | less
答案2
是的,这是有可能实现的。下面是两个例子:
使用管道两次:
ls | (cat;echo fuzz) | less
使用输入重定向:
ls | less < <(cat;echo fuzz)
在zsh shell您还可以使用:
ls | <<<"buzz" | less
#or
ls | < <(echo fuzz) | less
答案3
如果您只想列出当前目录中的每个可见名称,请将其添加c
到列表末尾,然后在以下位置查看结果less
:
printf '%s\n' * c | less
这个答案的其余部分涉及创建一个单独的文件名列表,向该列表添加一些内容,然后将其用作 的参数less
,或者查看 中的列表less
(取决于我们如何解释问题)。
您可以使用一个数组来存储当前目录中所有可见文件的名称:
names=( * )
您可以将内容添加到数组的末尾:
names+=( c )
...或者当您设置数组的初始值时一次性:
names=( * c )
您可以使用数组中的元素作为参数less
:
less -- "${names[@]}"
(用于--
确保将less
参数解释为文件名而不是选项。如果任何文件名以破折号开头,这一点很重要。)
names
或者,您可以使用以下命令列出数组的元素less
:
printf '%s\n' "${names[@]}" | less
执行相同的操作,但使用位置参数列表代替命名数组:
set -- *
set -- "$@" c
... 或者,
set -- * c
然后less
使用这些元素作为参数进行调用:
less -- "$@"
或者,用 列出位置参数less
:
printf '%s\n' "$@" | less
请注意,上述所有命令中的引号都很重要。"$@"
像这样的引用"${names[@]}"
可确保 shell 将它们扩展为单独引用的元素的列表。