Answers:
因为不是<
,而是<()
完全不同的。这称为流程替换,它是某些外壳程序的功能,使您可以将一个流程的输出用作另一个流程的输入。
在>
与<
运营商输出重定向到输入的文件。该<()
运营商的命令(进程)的交易,而不是文件。当你跑步
sort < (ls)
您试图ls
在子shell中运行命令(这是括号的意思),然后将该子shell作为输入文件传递给sort
。但是,这是不可接受的语法,您会看到错误。
then sort is attempting to read the subshell as its input file
→这显然是错误的,因为Bash甚至不会解析语法。既ls
没有sort
运行,也没有实际运行。
< (ls)
在这里不是有效的令牌。
(ls)
它将ls
在子shell中运行。
因为那就是它的本意。
<(...)
in bash
是进程替换的语法。它是从中的同一运算符复制而来的ksh
。
<
,(
,)
,|
,&
,;
是特殊的词法标记中bash
被用于形成不同的组合特殊运算符。<
,<(
,<<
,<&
...各有各的作用。<
用于重定向。<file
,< file
将从文件重定向输入。<'(file)'
将从一个名为的文件中重定向输入(file)
,但它<(file)
是一个不同的运算符,而不是重定向运算符。
< (file)
将<
后面(file)
。在这种情况下,在bash
,(file)
是无效的。(...)
在某些情况下可以作为单个令牌有效:
(sub shell)
func () {
...
}
var=(foo bar)
但不在
sort < (cmd)
在fish
外壳中,情况有所不同。In中fish
,(...)
用于命令替换(等效于$(...)
in bash
)。并且<
用于像Bourne一样的shell中的输入重定向。
所以在fish
:
sort <(echo file)
与以下内容相同:
sort < (echo file)
那是:
sort < file
但这与的bash
流程替换完全不同。
在yash
外壳程序中,另一个POSIX外壳<(...)
程序不是用于进程替换,而是用于进程重定向
在那里,
sort <(ls -l)
短缺:
sort 0<(ls -l)
是重定向运算符。它或多或少等于:
ls -l | sort
在中bash
,<(ls -l)
会扩展为管道的路径,因此更像是:
ls -l | sort /dev/fd/0
在中zsh
,(...)
作为globlob运算符((*.txt|*.png)
将扩展到txt
和png
文件)和glob限定符(*(/)
例如,扩展到目录文件)作为重载。
在中zsh
,在:
sort < (ls -l)
那(ls -l)
将被视为全局限定符。该l
水珠预选赛是要匹配的链接数,并预计之后的数l
(如ls -ld ./*(l2)
将列出与2个链接中的文件),所以这就是为什么你会得到一个zsh: number expected
错误出现。
sort < (w)
zsh: no matches found: (w)
而是会给出一个错误,因为(w)
匹配可写的空名称文件。
sort < (w|cat)
本可以对当前目录中w
and和/或cat
文件的内容进行排序...
sort < $(ls -l)
会出现此错误:bash: $(ls -l): ambiguous redirect
$(ls -l)
扩展到多个单词。使用引号防止split + glob(sort < "$(echo file)"
)。请注意,这种行为或bash
与POSIX sh 的行为不同之处在于,bash在非交互式时(即使调用时也是如此sh
)也会在其中进行split + glob 。
ls -l | sort /dev/fd/0
我可以说的输出ls -l
存储在其中,/dev/fd/0
并且sort
命令读取该输出以提供所需的输出。我正在tail -f --retry /dev/fd/0
监视该文件,但未得到任何输出。为什么?我如何读取该文件?
(foo | psub)
用来实现输入过程的替代;尚无替代(ha)替代输出过程。