自动捕获上次执行的命令输出到一个变量

我希望能够在后续命令中使用上次执行的命令的结果。 例如,

$ find . -name foo.txt
./home/user/some/directory/foo.txt

现在让我们说我想要能够在编辑器中打开文件,或者删除它,或者用它做其他事情,例如

mv <some-variable-that-contains-the-result> /some/new/location

我该怎么做? 也许使用一些bash变量?

更新:

为了澄清,我不想手动分配东西。 我所追求的就像内置的bash变量,例如

ls /tmp
cd $_

$_保存了前一个命令的最后一个参数。 我想要类似的东西,但最后一个命令的输出。

最终更新:

塞思的答案工作得很好。 记住几件事情:

  • 不要忘记在第一次尝试解决方案时touch /tmp/x
  • 如果最后一条命令的退出代码成功,结果将被保存

  • 这是一个非常糟糕的解决方案,但似乎大部分时间都适用。 在测试过程中,我注意到它在命令行上获取^ C时有时效果不佳,尽管我稍微调整了它以表现得更好一些。

    这种黑客攻击只是一种交互模式,我相信我不会向任何人推荐它。 后台命令可能会导致比正常情况下更少定义的行为。 其他答案是以编程方式获得结果的更好方法。


    这就是说,这里是“解决方案”:

    PROMPT_COMMAND='LAST="`cat /tmp/x`"; exec >/dev/tty; exec > >(tee /tmp/x)'
    

    设置此bash环境变量并根据需要发出命令。 $LAST通常会有你想要的输出:

    startide seth> fortune
    Courtship to marriage, as a very witty prologue to a very dull play.
                    -- William Congreve
    startide seth> echo "$LAST"
    Courtship to marriage, as a very witty prologue to a very dull play.
                    -- William Congreve
    

    我不知道任何自动执行此操作的变量。 除了复制粘贴结果之外,你可以重新运行你刚刚做的任何事情,例如

    vim $(!!)
    

    哪里!! 是历史扩张意思是'前一个命令'。

    如果你期望有一个空格或其他字符的文件名可能会阻止正确的参数解析,请引用结果( vim "$(!!)" )。 如果不加引号,只要不包含空格或其他shell解析令牌,就可以一次打开多个文件。


    Bash是一种丑陋的语言。 是的,您可以将输出分配给变量

    MY_VAR="$(find -name foo.txt)"
    echo "$MY_VAR"
    

    但更好的希望你最难find只返回一个结果,并且结果中没有任何“奇怪”的字符,比如回车或换行符,因为它们在分配给Bash变量时将被无声修改。

    但使用它时,最好小心引用你的变量!

    最好直接对文件进行操作,例如使用find-execdir (参考手册)。

    find -name foo.txt -execdir vim '{}' ';'
    

    要么

    find -name foo.txt -execdir rename 's/.txt$/.xml/' '{}' ';'
    
    链接地址: http://www.djcxy.com/p/56859.html

    上一篇: automatically capture output of last executed command into a variable

    下一篇: bash/fish command to print absolute path to a file