Josh M. Asked: 2022-10-21 08:24:41 +0800 CST2022-10-21 08:24:41 +0800 CST 2022-10-21 08:24:41 +0800 CST 在管道到下一个命令时从标准输入读取? 772 当输出被管道传输时,如何提示用户输入? > (echo -n 'input data: '; read TEST; export TEST) | echo "done: ${TEST}" 这不会显示“输入数据”提示,也不会从标准输入读取任何内容,而是仅显示: done: linux bash 1 个回答 Voted Best Answer Kamil Maciorowski 2022-10-21T08:55:11+08:002022-10-21T08:55:11+08:00 foo | bar foo同时bar运行。您的代码显示done:是因为 finalecho没有读取其标准输入,并且它不等待通过其标准输入传输的任何内容。它立即完成工作。 此外${TEST}after与您设置的变量 before|无关。在构建管道时,Bash 在单独的子 shell 中运行每个命令(最后一个命令可能会或可能不会在主 shell 的上下文中执行)。read| 这就是我认为你想要的: echo -n 'input data: '; read TEST echo "done: ${TEST}" (在 Bashread -p 'input data: ' TEST中也可以使用)。 这里没有必要将任何东西传递给任何东西。 一般来说,如果您需要从管道内(我的意思是从真正需要的管道内)与用户交互,/dev/tty可能会有用。人工示例: echo foo | ( read -p 'i: ' var </dev/tty; echo "d: $var" >/dev/tty; cat ) | nl 这里read不是从头读echo,而是从形式上读/dev/tty。既不read是也不是第二个echo打印到nl:read -p默认情况下将其提示打印到stderr,echo打印到/dev/tty是因为我们重定向了。实际上,数据(foo+newline )从echotocat到 tonl就好像没有其他东西一样。 它可能看起来像一个技巧,但它是一个合法的用例。例如,当 stdout 和 stderr 都被重定向时,如何/为什么输出到 tty?ssh和我的答案。
foo | bar
foo
同时bar
运行。您的代码显示done:
是因为 finalecho
没有读取其标准输入,并且它不等待通过其标准输入传输的任何内容。它立即完成工作。此外
${TEST}
after与您设置的变量 before|
无关。在构建管道时,Bash 在单独的子 shell 中运行每个命令(最后一个命令可能会或可能不会在主 shell 的上下文中执行)。read
|
这就是我认为你想要的:
(在 Bash
read -p 'input data: ' TEST
中也可以使用)。这里没有必要将任何东西传递给任何东西。
一般来说,如果您需要从管道内(我的意思是从真正需要的管道内)与用户交互,
/dev/tty
可能会有用。人工示例:这里
read
不是从头读echo
,而是从形式上读/dev/tty
。既不read
是也不是第二个echo
打印到nl
:read -p
默认情况下将其提示打印到stderr,echo
打印到/dev/tty
是因为我们重定向了。实际上,数据(foo
+newline )从echo
tocat
到 tonl
就好像没有其他东西一样。它可能看起来像一个技巧,但它是一个合法的用例。例如,当 stdout 和 stderr 都被重定向时,如何/为什么输出到 tty?
ssh
和我的答案。