![逐行执行标准输出结果并有提示确认](https://linux22.com/image/163128/%E9%80%90%E8%A1%8C%E6%89%A7%E8%A1%8C%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C%E5%B9%B6%E6%9C%89%E6%8F%90%E7%A4%BA%E7%A1%AE%E8%AE%A4.png)
我有一个命令(可能)打印几行,然后我想一行一行地执行它们(xargs
例如使用或其他任何东西):
find . -name "*string*" -print | awk '{ print "echo " $1 " >> file.txt" }' | xargs -L 1
每个echo ... >> file.txt
命令的执行都会给出提示Enter a value:
,用户必须明确键入yes
以进行确认或no
取消进一步执行该命令。
yes
例如,是否可以将其通过管道传输到一行中以始终输入?或者暂停直到用户输入“是”?
到目前为止我正在考虑两种可能的解决方案:
- 使用期望脚本。
- 逐行捕获执行的命令行的标准输出,并循环这些行,直到到达提示符,然后等待用户输入或自动添加
yes
或添加no
。
有没有更简单的方法来做到这一点并在之后管道一个额外的命令xargs
? (假设我是否总是想进入yes
?)。上述哪种解决方案会更好。我认为第二个更适合确保跨平台兼容性并避免像expect
.
答案1
您想要将名称包含该字符串的所有文件的路径名添加string
到 file 中file.txt
,并对每个文件进行确认。
这就是你如何做到这一点find
:
find . -name '*string*' -ok printf '%s\n' {} \; >>file.txt
如果用户回复(或) ,该-ok
选项将执行给定的实用程序,并插入找到的路径名。该命令将等待,直到给出答复。{}
y
yes
find
到总是回复y
、使用
yes | find ... >>file.txt
(或更改-ok
为-exec
)。
要始终回复n
,请使用
yes n | find ... >>file.txt
请注意,您的原始命令是不安全的,因为它创建的代码按原样包含文件名。因此,特制的文件名可能被用来创建代码来执行不应该执行的内容。