首页 > 解决方案 > 如何在 Bash 中的命令的先前 xargs 的管道的 grep 输出上运行类似 xargs 的命令

问题描述

出于好奇,我试图了解这里发生了什么,即使我可以复制并粘贴终端的输出来做我需要做的事情。以下命令不打印任何内容。

ls /opt/local/var/macports/registry/portfiles -1 | sed 's/-.*//g' | sort -u | parallel "sudo port -N install" {} 2>&1 | grep -Po "Use '\K.*(?=')" | parallel "{}"

我调用 ls 的目录包含一堆文件名,这些文件名以我要提取的字符串开头,并以第一个破折号结尾(因此 stringexample-4.2009 管道stringexample并行(像 xargs 但要单独运行每一行)。运行命令后sudo port install <stringexample>,我得到这样的错误输出:

Unable to activate port <stringexample>. Use 'port -f activate <stringexample>' to force the activation.

现在,我想跑步port -f activate <stringexample>。但是,我似乎无法对port -f activate gettext到达终端的输出做任何事情。

我什至不能做... | grep -Po "Use '\K.*(?=')" | xargs echo... | grep -Po "Use '\K.*(?=')" >> commands_to_run.txt(文件的输出流只创建一个空文件),尽管命令的部分较短:

ls /opt/local/var/macports/registry/portfiles -1 | sed 's/-.*//g' | sort -u | parallel "sudo port -N install {}" 2>&1 | grep -Po "Use '\K.*(?=')"

将命令打印到终端。为什么管道操作员在这里不起作用?如果我希望运行的命令正在输出到终端,那么肯定有一种方法可以捕获它们。

标签: bashunixterminalgrepxargs

解决方案


推荐阅读