它似乎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 的说法,您可以抓取stderr
read 正在执行的 ,这是正确的。不幸的是,尝试使用 读取stderr
不会保留 的变量key
,因此 的输出echo $key
最终将为空白。但是,在脚本中,它将保留变量,因为 read 行本身并未在脚本中从 重定向到stderr
。stdout
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
希望这可以帮助!