如何将管道和命令插入当前输入的末尾?

时间:2016-01-06 00:45:06

标签: bash shell zsh

我发现了一个名为espeak的好命令。 它可以从标准输入读取并说出其结果。

public void MyUpdate(MyType foo)
{
    /*Prep code for the loops*/        
    foreach (Thing bar in something)
    {
        foreach (Collection item in bar.Stuff)
        {
            Data dataRX = item.First;
            if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID))
            {
                // Update Data with the latest changes
                dataRX.fooBuddy = foo;
                goto exitLoops;
            }
        }
    }

    exitLoops: ;
}

无论如何,它运行正常,但我认为每次将$ du -sh . | espeak $ ls -a | grep foobar | espeak etc 放到一行的末尾并不高效。 所以我想自动插入它而不用手工打字。 有没有很好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:4)

假设您还想查看输出,可以这样做:

exec > >(tee >(espeak))

stdout重定向到tee进程,该进程将所有内容发送到espeak进程,并将其发送到控制台或stdout之前发送到的任何进程。 (对于那些在家中关注的人来说,stdout进程的tee在启动时尚未重定向,因此它仍然与exec之前相同命令。)

玩得开心。

将其关闭:

exec > /dev/tty

答案 1 :(得分:0)

在zsh中,有一个小部件accept-line在接受输入行时被触发。您可以使用自己覆盖默认小部件,如下所示:

function accept-line
{
    #here, add espeak to the current command
    BUFFER=$BUFFER" | espeak"

    # to be clear, if the input string was 'ls -l',
    # now it is 'ls -l | espeak', and this is the command that will be executed

    # trigger the real widget to accept the line and run the input buffer
    zle .accept-line
}
# register your new accept-line widget to replace the builtin one
zle -N accept-line

在这里,我使用了名称accept-line但是如果您想要命名覆盖函数my_superOverride,您可以在最后覆盖默认小部件:

zle -N accept-line my_superOverride

唯一的缺点是,对于像do something ; do something else这样的命令,它只会说do something else的输出。