未写入标准输出的控制台输出示例

未写入标准输出的控制台输出示例

它似乎read没有写入标准输出。

$ cat 测试.sh
/bin/bash #!/bin/bash
读取 -p“键入一个键并输入”键
echo “密钥是 $key”
$./test.sh
键入一个键并 Enterx
关键是 x
$ ./test.sh | tee 文件
键入一个键并 Enterx
关键是 x
$ cat 文件
关键是 x

不使用脚本进行尝试...

$ read -p “键入一个键并输入”键 | tee 文件
键入一个键并 Enterx
$ cat 文件
$

read命令描述这里.简单描述:“从标准输入读取一行”。

有关管道的信息,|来自Linux 命令行(第二版网络版)接下来是 William E. Shotts 的作品。

使用管道运算符“|”(竖线),一个命令的标准输出可以通过管道传输到另一个命令的标准输入中: command1 | command2

的手册页中tee有这样的描述:

从标准输入读取并写入标准输出和文件

手册页tee位于此处关联

所有其他写入控制台但实际上不使用标准输出的程序示例的列表在哪里,或者在没有这样的列表的情况下,了解何时写入控制台的程序不使用标准输出的一般规则是什么?

似乎read违反了最小惊讶原则

答案1

在您的示例中,read写入的是 stderr 而不是 stdout。以下是我所知道的:

$ read -p "键入一个键并按 Enter:" key >/dev/null
键入一个键并按 Enter:x
$ read -p “键入一个键并按 Enter:”键 2>/dev/null
X

您可以对任何想要重定向输出的程序执行此测试。

因此您要查找的命令是这样的:

$ read -p “键入一个键并按 Enter:”键 2>&1 | tee 文件
键入一个键并按 Enter:x
$ cat 文件
键入一个键并按 Enter:$

对于上述重定向的解释:

答案2

按照 wjandrea 的说法,您可以抓取stderrread 正在执行的 ,这是正确的。不幸的是,尝试使用 读取stderr不会保留 的变量key,因此 的输出echo $key最终将为空白。但是,在脚本中,它将保留变量,因为 read 行本身并未在脚本中从 重定向到stderrstdout 2>&1相反,脚本可以保留变量,因为它现在在重定向之前已设置。我认为为了更简单,可以使用echo行 。我已经添加了所有示例。

脚本示例:

:~$ cat test1.sh 
#!/bin/bash
read -p "type a key and Enter: " key
echo "the key was $key"

:~$ ./test1.sh | tee junk
type a key and Enter: G
the key was G

:~$ cat junk
the key was G

使用2>&1重定向:

:~$ ./test1.sh 2>&1 | tee junk
type a key and Enter: G
the key was G

:~$ cat junk
type a key and Enter: the key was G

带有echo行:

:~$ cat test.sh 
#!/bin/bash
echo -n "Type a key and press Enter: "
read key
echo "the key was $key"

echo使用 tee 命令:

:~$ ./test.sh | tee junk
Type a key and press Enter: X
the key was X

:~$ cat junk
Type a key and press Enter: the key was X

无脚本的示例:

stderr

:~$ read -p "Type a key and press Enter: " key 2>&1 |tee junk; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was 

:~$ cat junk
Type a key and press Enter: The key was 

使用echo和多个 tee 命令来代替:

:~$ echo -n "Type a key and press Enter: " | tee junk; read key; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was F

:~$ cat junk
Type a key and press Enter: The key was F

希望这可以帮助!

相关内容