xargs行为:语义还是Bug?

时间:2014-01-14 06:00:15

标签: shell command-line zsh

我想把很多目录推到堆栈上,我跑了:

echo ~/{Desktop,Downloads,Movies} | xargs pushd 并遇到xargs: pushd: No such file or directory

支持扩展不是导致我的想法与发生的事情不匹配的原因,因为echo ~/Desktop | xargs pusdh会导致同样的错误。

作为比较点,echo ~/Desktop | xargs cd会像预期的那样更改目录。

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

这是语义,等效语句应该是:

pushd $(echo ~/{Desktop,Downloads,Movies})

在我的实验之后,内置命令的行为就像

#!/bin/sh

    function pushd()
    {
        accept input from $1, $2, $3.....

        # Builtin will not read from stdin! So you can't use pipe.
    }

内置命令应该被视为 shell函数

<强> [编辑]

zsh中的'pushd'命令与'cd'一起实现,它只接受一个参数。 所以你不能在单个语句中推送多个目录。 source is there

答案 1 :(得分:0)

您确定xargs cd符合预期吗?我会感到惊讶!如果您需要确认,xargs会调用二进制文件,但pushd不会 - 运行type pushd。 <{1}}和cd作为外部二进制文件没有多大意义。

您需要捕获变量中的目录,并在shell进程本身的for循环中调用pushd,而不是从pushd调用,这是shell的子进程,因此,xargs或其子节点修改的任何目录状态都不会传递给父shell。