Bash 阅读内置的不';不要用管子工作

Bash 阅读内置的不';不要用管子工作,bash,io,stdin,Bash,Io,Stdin,我想请求用户确认从stdin读取(显示输出[Y/n])。如果提供了一些参数,或者没有提供参数,但是有一些输入,那么它可以正常工作。但是,如果某些数据通过管道传输到脚本,则不会进行确认 #!/bin/bash output_file=$(mktemp) cleanup() { rm -f "$output_file" } trap cleanup 0 1 2 3 15 if [ $# -gt 0 ]; then while [ $# -gt 0 ]; do

我想请求用户确认从stdin读取(显示输出[Y/n])。如果提供了一些参数,或者没有提供参数,但是有一些输入,那么它可以正常工作。但是,如果某些数据通过管道传输到脚本,则不会进行确认

#!/bin/bash

output_file=$(mktemp)

cleanup() {
    rm -f "$output_file"
}

trap cleanup 0 1 2 3 15

if [ $# -gt 0 ]; then
    while [ $# -gt 0 ]; do
        echo "$1" >> "$output_file"
        shift
    done
else
    while read -r line; do
        echo "$line" >> "$output_file"
    done
fi

while true; do
    read -p "Display output? [Y/n]" response
    if [ -z "$response" ]; then
        break
    fi

    case $response in
        [Yy]*) break;;
        [Nn]*) exit;;
    esac
done

less "$output_file"

是什么阻止了
read-p
工作?应该做些什么来提供一致的行为?

如果脚本从标准输入读取所有内容,那么
read-p
将得到什么?如果输入不是“交互式设备”(又称终端),它可能不会提示。你有没有检查Bash手册页?它说:

-p
提示符

在尝试读取任何输入之前,显示提示,不带尾随换行符。仅当输入来自终端时,才会显示提示


当您的输入来自管道时,它不是来自终端。

如果脚本从标准输入读取所有内容,那么
read-p
将得到什么?如果输入不是“交互式设备”(又称终端),它可能不会提示。你有没有检查Bash手册页?它说:

-p
提示符

在尝试读取任何输入之前,显示提示,不带尾随换行符。仅当输入来自终端时,才会显示提示


当您的输入来自管道时,它不是来自终端。

命令从标准中读取输入。如果从管道输入标准输入,则read将从管道而不是从终端查找其数据

在大多数平台上,您可以通过直接从tty设备重定向read命令的输入来解决此问题,如下所示:


read-p“显示输出?[Y/n]”响应命令从标准输入读取输入。如果从管道输入标准输入,则read将从管道而不是从终端查找其数据

在大多数平台上,您可以通过直接从tty设备重定向read命令的输入来解决此问题,如下所示:


read-p“Display output?[Y/n]”响应您可能希望在捕获信号列表中添加13个(
PIPE
),因此如果脚本正在写入管道,但下游程序死亡,临时文件被删除。
-p
作为
读取的一部分,只有在终端提供输入时才起作用。您可能需要将13(
管道
)添加到捕获信号列表中,因此如果脚本正在写入管道,但下游程序死亡,临时文件被删除。
-p
作为
读取的一部分,只有在终端提供输入时才起作用。