假设我有ls | xargs -n1 -p rm
,我如何使用yes
或yes n
来自动回答该标志生成的问题-p
?
我尝试过yes n | (ls | xargs -n1 -p rm)
但没有成功。
更新: 问题不是真正的问题rm
,而是如何yes
正确使用的问题。我有一个别名或一个使用的函数xargs -p
,我喜欢它在执行之前询问我并向我显示它正在做什么。当我知道它会做什么时,我希望能够yes
自动遍历xargs -p
函数中的所有内容。因此,尽管该示例使用了rm
,但它并不是真正的内容。
另外,为了特别清楚,我不想修改我的别名或函数来使用或不使用-p
.我宁愿只是从外部输入 yes。
老实说,我以为类似yes | some_function_asking_me_questions
或 的东西some_function_asking_me_questions <( yes )
会起作用,但事实并非如此。
第二次编辑:另一个例子:我有一个别名来列出某个区域中的 AWS SNS 主题,例如:
alias delete_snstopics="list_sns | cut -f 2 | xargs -n1 -p aws sns delete-topic --topic-arn "
然后我有一个函数,可以为 AWS 中的每个区域查找并提示删除这些 SNS 主题。我想看到aws sns delete-topic --topic-arn $1
xargs 会运行,因为 SNS 主题的 id 每次都不同,如果出现问题,我可以在 Web 控制台中匹配 SNS id。此外,有时我可能不想删除特定区域的 SNS 主题。这就是为什么我想使用yes
这个函数,这样我就可以使用相同的函数进行部分删除和完全删除,并且仍然获得有用的输出。说得通?
答案1
让我们分析一下你的命令:
yes n | (ls | xargs -n1 -p rm)
管道ls | xargs -n1 -p rm
读取ls
标准输入,但将标准输出重定向到xargs
,将其作为标准输入,并且其标准输出不变。
现在您将 的输出通过管道传输yes
到此管道中。由于该管道的标准输入进入ls
,它甚至不读取它,xargs
因此看不到任何内容。
现在明显的问题是:如何xargs
询问你是否执行该命令?毕竟,它的标准输入(程序通常读取用户交互的地方)被重定向以读取ls
!的输出。
好吧,答案是xargs
通过直接打开终端文件来绕过这些问题的重定向机制/dev/tty
。因此确认输入不受文件重定向的影响。
要输入到xargs
,您需要一个程序,该程序可以通过该程序控制的终端设备来呈现该过程。一个非常强大(但也相当复杂)的程序是expect
.不幸的是我不知道更简单的方法来实现你想要的。
答案2
您可以使用:
ls | xargs -n1 rm -r
这适用于目录或/和文件。