2016-09-21 75 views

回答

1

我不完全确定你的意思是返回一个目录。根据什么zsh在这里,echo <(-)会给你一个线索。它可能会打印/dev/fd/12之类的东西,或者根据您的系统打印临时文件的名称。

<(...)是一个zsh构造。 Zsh创建一个子shell并在命令stdout指向管道的情况下在子shell中运行命令。然后用/dev/fd/proc/self/fd取代管道的另一端,具体取决于您的操作系统。 -命令实际上是一个precommand修饰符,它不会单独执行任何操作。所以在它完成任何事情之后,它就会结束并随着它走向管道的尽头。 cat读取文件结束并依次退出。比较cat <(echo hi)之类的事情。

类似的形式=(...)强制使用临时文件。如果您有像diff这样的命令需要能够在文件中寻找随机位置,这非常有用。最后,有>(...)这将输出到一个命令,有点像一个管道。

+0

是,'回声<( - )'将打印'的/ proc /自/ FD/11',在我的系统上,这返回$ OLDPWD。我想知道这是否意外,或者是否可以预料。我理解你的解释方式,但不是(1)为什么返回的东西不是一些临时不存在的文件句柄,也不是(2)获得$ OLDPWD的一致性。 –

+1

我想你已经有'-'别名到'popd'或'cd -'之类的东西了。除非设置了'pushd_silent'选项,否则它们会打印新的目录。但是因为'<(...)'中的命令在子shell中运行,所以目录的更改不会在父目录中生效。我认为你使用的是像oh-my-zsh这样的插件框架,如果你有别名,你不知道在那里。 – okapi

+0

啊,就是这样! zsh中的'alias'显示''''确实是'cd -'的缩写,可能确实是由'oh-my-zsh'中的一个(默认)插件引入的。 –

1

-是一个precommand修饰符;根据man zsh

-  The command is executed with a `-' prepended to its argv[0] 
      string. 

在表达式cat <(-),这应该等于空指令(没有输出自动成功)运行,如同其被命名为-。不过,我不确定如何获得与旧工作目录相关的任何输出。 cd -将打印工作目录, but - doesn't trigger a directory change even with auto_cd enabled (and auto_cd shouldn't apply inside a process substitution anyway, since SHIN_STDIN`未设置)。

(道歉。这可能是更适合作为关于这个问题的评论,而不是一个答案)