如何捕获提示用户确认的 bash 命令的输出,而不阻塞输出或命令
How to capture the output of a bash command which prompts for a user's confirmation without blocking the output nor the command
我需要捕获 bash 命令的输出,该命令提示用户确认而不改变其流程。
我只知道两种捕获命令输出的方法:
- output=$(command)
- command > file
在这两种情况下,整个过程都被阻塞,没有任何输出。
例如,没有 --assume-yes:
output=$(apt purge 2>&1 some_package)
我无法打印回输出,因为命令尚未完成。
有什么建议吗?
编辑 1:用户必须能够回答提示。
编辑 2:我使用 dash-o 的回答来完成 bash script 允许用户 remove/purge 来自任何 Debian/Ubuntu 发行版的所有过时软件包(没有安装候选)。
要捕获正在等待提示的部分输出,可以在临时文件上使用尾部,如果需要,可以使用 'tee' 来保持输出流畅。这种方法的缺点是 stderr 需要与 stdout 绑定,因此很难区分两者(如果这是一个问题)
#! /bin/bash
log=/path/to/log-file
echo > $log
(
while ! grep -q -F 'continue?' $log ; do sleep 2 ; done ;
output=$(<$log)
echo do-something "$output"
) &
# Run command with output to terminal
apt purge 2>&1 some_package | tee -a $log
# If output to terminal not needed, replace above command with
apt purge 2>&1 some_package > $log
没有通用的方法来判断(通过脚本)程序何时提示输入。上面的代码查找提示字符串 ('continue?'),因此必须根据命令对其进行自定义。
我需要捕获 bash 命令的输出,该命令提示用户确认而不改变其流程。
我只知道两种捕获命令输出的方法:
- output=$(command)
- command > file
在这两种情况下,整个过程都被阻塞,没有任何输出。
例如,没有 --assume-yes:
output=$(apt purge 2>&1 some_package)
我无法打印回输出,因为命令尚未完成。
有什么建议吗?
编辑 1:用户必须能够回答提示。
编辑 2:我使用 dash-o 的回答来完成 bash script 允许用户 remove/purge 来自任何 Debian/Ubuntu 发行版的所有过时软件包(没有安装候选)。
要捕获正在等待提示的部分输出,可以在临时文件上使用尾部,如果需要,可以使用 'tee' 来保持输出流畅。这种方法的缺点是 stderr 需要与 stdout 绑定,因此很难区分两者(如果这是一个问题)
#! /bin/bash
log=/path/to/log-file
echo > $log
(
while ! grep -q -F 'continue?' $log ; do sleep 2 ; done ;
output=$(<$log)
echo do-something "$output"
) &
# Run command with output to terminal
apt purge 2>&1 some_package | tee -a $log
# If output to terminal not needed, replace above command with
apt purge 2>&1 some_package > $log
没有通用的方法来判断(通过脚本)程序何时提示输入。上面的代码查找提示字符串 ('continue?'),因此必须根据命令对其进行自定义。